私は以下のような巨大な文字列を持っています:
String str = "aaaaaaa"
+ "bbbbbbbb"
+ "cccccccc"
....
+ "zzzzzzzz"; // about 200 lines long
それはメモリの大きな浪費ですか?1行に入れるか、使用する方が良いStringBuilder
でしょうか? これは、長い SQL を作成するために行われます。
私は以下のような巨大な文字列を持っています:
String str = "aaaaaaa"
+ "bbbbbbbb"
+ "cccccccc"
....
+ "zzzzzzzz"; // about 200 lines long
それはメモリの大きな浪費ですか?1行に入れるか、使用する方が良いStringBuilder
でしょうか? これは、長い SQL を作成するために行われます。
いいえ。コンパイラは、すべての文字列が一定である場合(質問にあるように)、コンパイル時に連結を実行します。そのため、最終的にはバージョンよりもパフォーマンスが向上StringBuilder
します。
StringBuilder
(または) を使用して、それ以外の場合は非定数部分StringBuffer
の連結を実行します。
したがって、コンパイルされたバージョンは次のとおりです。
String x = "a" + "b";
以下とまったく同じである必要があります。
String x = "ab";
「一定でない」部分は、ブラケットを賢く使用して(非常にマイナーな)余分な効率を得ることができることを意味することに注意してください。例えば:
int value = ...;
String x = "a" + value + "b" + "c";
... は以下よりも効率が悪い:
int value = ...;
String x = "a" + value + ("b" + "c");
...最初の追加として、"b"
個別"c"
に。効率的なバージョンは次と同等です。
int value = ...;
String x = "a" + value + "bc";
これが正当なマイクロ最適化として使用されたのを見た記憶はありませんが、少なくとも興味深い点です。
Java の現在のバージョンでは、各+
(連結) 操作が自動的に操作にコンパイルされます。ただし、ループ内にある場合は、反復ごとに新しいを作成し、その効果を無効にするため、明示的に管理する方がよいでしょう。StringBuilder
append()
StringBuilder
StringBuilder
AFAIK JVMには内部的に文字列のプールがあり、作成したすべての文字列がそこに保存され、最も古い/最も使用されていない文字列が破棄されます(どの文字列をどのように選択するかはわかりません)。String.intern() を明示的に呼び出すと、JVM に String をプールに入れるように指示することになります。
+ を使用して 2 つの文字列を連結すると、プールに 3 つの文字列ができます。a + b + c を連結すると、5 つの文字列 (a、b、ab、c、abc) になります。
少なくともそれは古い JVM バージョンで思い出すことですが、Luiggi はおそらく正しいでしょう。新しいバージョンでは内部的に最適化されているということです。