JavaでString、StringBuilder、およびStringBufferを使用しました。
効率の観点から考えていたときに、この質問を考えました。
文字列連結での「+」の使用は効率に影響しますか?
JavaでString、StringBuilder、およびStringBufferを使用しました。
効率の観点から考えていたときに、この質問を考えました。
文字列連結での「+」の使用は効率に影響しますか?
はい。
文字列定数に「+」を使用すると、コンパイラが連結を実行できるため、最も効率的です。
2 つの String を結合する場合、このconcat
メソッドは StringBuilder を使用しないので最も効率的です。
下位互換性を除いて、StringBuffer を使用する正当な理由はほとんどありません。StringBuilder または StringWriter を選択することをお勧めします。ただし、JDK の StringBuilder よりも明示的に使用されることが多い:P
単一のステートメントで連結している場合は、コンパイラ/JIT コンパイラが . を使用して自動的に最適化するため、問題ありませんStringBuilder
。
したがって"a"+b+"c"
、最適化されます(new StringBuilder("a").append(b).append("c")).toString()
String
ただし、ループ内で多数の s を連結している場合はStringBuilder
、プログラムを大幅に高速化するため、必ず a を明示的に使用してください。
String a = "";
for( int i = 0; i < 1000000; i++ )
a += i;
に変更する必要があります
StringBuilder sb = new StringBuilder();
for( int i = 0; i < 1000000; i++ )
sb.append(i);
String a = sb.toString();
あなたの例では:
" Does +" + " use in String concatenation affect efficiency? "
文字列をリテラル化する必要があります。これはコンパイラによって置き換えられる可能性があるため、StringBuffer / append/toStringよりも高速になります。
しかし、何に比べて効率的/高速ですか?コードの実行?コードを書く?コードの読み取り?
読んでから
"Foo = " + foo;
非常に簡単です。100万回繰り返されない限り、つまり「s + =s2;」である限り、これをお勧めします。百回繰り返した。
特に、
System.out.println ("Player " + n + " scores " + player[n].score);
よりもはるかに読みやすい
System.out.println (new StringBuffer ("Player ").append ((Integer.valueOf (n)).toString ().append (" scores ").append (...
高性能を必要とするアプリケーション、非常に大量の文字列、または大量の文字列を再帰的に連結するアプリケーションでは、これを避けてください。
少しはい、でもまだいいえ
JLS から、15.18.1.2
文字列連結の最適化
実装では、変換と連結を 1 つのステップで実行して、中間の String オブジェクトを作成してから破棄することを回避できます。文字列連結の繰り返しのパフォーマンスを向上させるために、Java コンパイラは StringBuffer クラスまたは同様の手法を使用して、式の評価によって作成される中間 String オブジェクトの数を減らすことができます。
プリミティブ型の場合、実装では、プリミティブ型から文字列に直接変換することで、ラッパー オブジェクトの作成を最適化することもできます。
'+' を使用して複数回連結を使用している場合は、ある程度拡張できます。String a + String b を実行すると、実際には内部で StringBuffer オブジェクトが作成され、StringBuffer の append() が使用されます。したがって、「+」を実行するたびに、新しい一時 StringBuffer オブジェクトが作成され、「a」で初期化されてから「b」が追加され、文字列オブジェクトに変換されます。
したがって、複数の連結が必要な場合は、StringBuffer(スレッドセーフ)/StringBuilder(スレッドセーフではない) オブジェクトを作成して追加し続ける必要があります。これにより、StringBuffer オブジェクトが何度も作成されるのを回避できます。