[Java] StringBuilderの使い方(Stringを連結するクラス)
今回は、可変長文字列クラスのStringBuilderを紹介します。
固定長文字列クラスのStringと異なる点は以下になります。
●文字列を連結・削除をメモリ消費を抑えて実行可能
<Stringの場合>
Stringで文字列を連結すると、余計なオブジェクト生成を行ってしまいます。
例)
StringA = "abc"
StringB = "def"
StringC = "ghi"
StringD = "jkl"
StringA + StringB + StringC + StringDを行う場合、
前の連結処理から順番に実行されるため、
以下のオブジェクトが連続的に生成されます。
StringA + StringB = "abcdef" のオブジェクト
StringA + StringB + StringC = "abcdefghi" のオブジェクト
StringA + StringB + StringC + StringD = "abcdefghijkl" のオブジェクト
「Stringクラスが自身を変更できないため、新しいStringクラスを常に生成する」
ことが原因で発生している事象です。
そのため、forやwhileでループした処理中にStringの文字列連結を書くと
乗算で使用メモリが増大していきます。よって、
「メモリを大量に消費+ガベージコレクション処理でパフォーマンス低下」が発生します。
<StringBuilderの場合>
対して、上記の処理をStringBuilderで行ってみます。
StringA~Dは同一です。
// StringBuiilderオブジェクト生成
StringBuilder builder = new StringBuilder();
// StringA~Dを連結
builder.append(StringA)
builder.append(StringB)
builder.append(StringC)
builder.append(StringD)
builderオブジェクトは無指定だと16バイトの領域を自身に持っていて、
appendされた文字列を自身の領域にコピーします。
ですので、自身の領域を超えない限りは追加の領域を作成しません。
ただし、16バイトを超えた場合、「(以前の領域+1)*2」の領域を
新しく確保するため、頻繁に領域更新が発生すると、
Stringまではいきませんが、パフォーマンス低下が起こります。
それを防ぐためには、StringBuilderをnewするときにサイズを指定します。
// 10000バイトでStringBuilderを作成
StringBuilder builder = new StringBuilder(10000);
あまりに大きく領域を確保してしまうと、それはそれで無駄ですので、
処理に応じた適切な領域を確保しましょう。
最後に簡単な例を紹介します。
public class TestStringBuilder {
public static void main(String[] args){
// 無指定の場合、16バイトで初期化
StringBuilder builder = new StringBuilder();
// 10文字追加(合計10バイト)
builder.append("1234567890");
// 10文字追加(合計20バイト):ここで、(16+1)*2=34バイトに拡張される。
builder.append("1234567890");
// 10文字追加(合計30バイト)
builder.append("1234567890");
// 10文字追加(合計40バイト):ここで、(34+1)*2=70バイトに拡張される。
builder.append("1234567890");
// 標準出力に表示(toString()すればStringで出力可能)
System.out.println(builder.toString());
}
}
スポンサードリンク
関連記事
-
[Java][基本] ループ処理(for文)
Javaのループ処理の基本である、for文を解説します。 ●文法 for( [①初期化];
-
[Java][Spring] DIする方式を細かく見てみる① @ScopeでのSingletonとPrototypeの指定
今回は@Scopeアノテーションを用いて、オブジェクトをDIする方式を選択してみます。 ●解説
-
[Java] 文字列の分割(split)
こんにちは。 今回は、文字列の分割について解説します。 昔はStringTokenize
-
[Java][Jersey] JerseyでRESTfulなJAX-RS Webサービス作成
こんにちは、keiです。 今回はRESTfulなWeb Serviceの作成を行っていきます。
-
[Java][Eclipse] Mavenが利用可能な動的Webプロジェクトの作成
こんにちは、keiです。 今回は、Mavenが利用可能な動的Webプロジェクトの作成について解
-
[Java][Spring] Spring3でDIしてみる!(アノテーション使用)
Spring3を使って、一番基本的な形のプログラムを作成してみます。 今回は、アノテーションを
-
[Java][Framework] Spring BootのJPAでDB接続した際のEntityキャッシュのクリア方法
Spring BootのJPAでDBアクセスした際に、処理を一定量こなすと、Heapが足りなくな
-
[Java] 日付の計算方法(DateFormat、Date、Calendar)
こんにちは、kei0310です。 Javaで日付を計算する方法について解説します。 まず
-
[Java] テキストファイルの読み込み方法
こんにちは、今回はテキストファイルをJavaで読む方法を紹介します。 標準で提供されているクラ
-
[Java][MySQL] JavaからMySQLを使う方法
MySQLは、フリーでありながら商用としても使用できるパワーを持つデータベース(RDB)です。
スポンサードリンク
- PREV
- [Java] テキストファイルの読み込み方法
- NEXT
- [bash] 文字列の分割(split処理)