4

JavaでString、StringBuilder、およびStringBufferを使用しました。
効率の観点から考えていたときに、この質問を考えました。

文字列連結での「+」の使用は効率に影響しますか?

4

5 に答える 5

6

はい。

文字列定数に「+」を使用すると、コンパイラが連結を実行できるため、最も効率的です。

2 つの String を結合する場合、このconcatメソッドは StringBuilder を使用しないので最も効率的です。

下位互換性を除いて、StringBuffer を使用する正当な理由はほとんどありません。StringBuilder または StringWriter を選択することをお勧めします。ただし、JDK の StringBuilder よりも明示的に使用されることが多い:P

StringBuffer は死んでいて、長く生きている StringBuffer

于 2011-08-03T13:51:23.480 に答える
4

単一のステートメントで連結している場合は、コンパイラ/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();
于 2011-08-03T13:53:06.727 に答える
1

あなたの例では:

" 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 (...

高性能を必要とするアプリケーション、非常に大量の文字列、または大量の文字列を再帰的に連結するアプリケーションでは、これを避けてください。

于 2011-08-03T14:13:17.000 に答える
1

少しはい、でもまだいいえ

JLS から、15.18.1.2

文字列連結の最適化

実装では、変換と連結を 1 つのステップで実行して、中間の String オブジェクトを作成してから破棄することを回避できます。文字列連結の繰り返しのパフォーマンスを向上させるために、Java コンパイラは StringBuffer クラスまたは同様の手法を使用して、式の評価によって作成される中間 String オブジェクトの数を減らすことができます。

プリミティブ型の場合、実装では、プリミティブ型から文字列に直接変換することで、ラッパー オブジェクトの作成を最適化することもできます。

于 2011-08-03T13:51:10.320 に答える
-2

'+' を使用して複数回連結を使用している場合は、ある程度拡張できます。String a + String b を実行すると、実際には内部で StringBuffer オブジェクトが作成され、StringBuffer の append() が使用されます。したがって、「+」を実行するたびに、新しい一時 StringBuffer オブジェクトが作成され、「a」で初期化されてから「b」が追加され、文字列オブジェクトに変換されます。

したがって、複数の連結が必要な場合は、StringBuffer(スレッドセーフ)/StringBuilder(スレッドセーフではない) オブジェクトを作成して追加し続ける必要があります。これにより、StringBuffer オブジェクトが何度も作成されるのを回避できます。

于 2011-08-03T14:35:04.850 に答える