2017-03-08 15 views
1

現在、javacが文字列連結を検出すると、コードはStringBuilderを使用するように変換されます。たとえば:StringBuilderのは、明示的なサイズではないので文字列連結に必要な回避策

String a = String.valueOf(System.currentTimeMillis()); 
    String b = String.valueOf(System.currentTimeMillis()); 
    String c = String.valueOf(System.currentTimeMillis()); 
    String d = a + b + c + "_IND"; 

String d = new StringBuilder().append(a).append(b).append(c).append("_IND"); 

のようなものになり、デフォルトのサイズが使用され、多くの場合、デフォルトのサイズが小さすぎると、実行時に呼び出すexpandCapacityになります。

アプリケーションのプロファイリング中に、多くのそのような操作が見られました。さまざまなHashMapのキーを作成し、JSFなどの各要素に固有のキーを作成します。これは余分なメモリ使用量をもたらします。

これを減らす方法はありますか?あなたは大きな 文字列のサイズを解釈し、そのデフォルトの容量としてやや よりも推定サイズであなたのStringBuiderを初期化するために、常にwiseableある のStringBuilderで大きな文字列を挿入しようとしている場合には

+0

currentTimeMillisを追加するだけなので、StringBuilderのサイズの初期の考え方はありませんか?何か_like_ new StringBuilder(System.currentTimeMillis()。toString()。length。3 + 4) –

+0

これは単なる例であり、文字列ビルダーを使用するたびに連結するために使用できます。 –

+0

[容量のサイズはStringBuilderですか?](http://stackoverflow.com/questions/13360229/most-efficient-initial-capacity-size-for-stringbuilder) – Jeremy

答えて

2

StringBuilderの初期化能力を思いつくための強調式を導き出すことで、サイズの過小評価や過大評価のコストを抑えることができます。

StringBuilderは、作成されている文字列をchar配列の形式で格納するためです。 StringBuilderの容量は、この配列の長さです。配列がオーバーフローすると、新しい(より長い)配列が割り当てられ、内容がその配列に転送されます。これにより容量が増加します。

関連する問題