4

コンパイルしたコードをjavacコマンドラインで確認し、+演算子を使用して文字列連結を使用するたびに、コンパイルしたコードがStringBuilderのappend()メソッドに置き換えられていることを確認しました。StringBuilderとString連結を使用すると、バイトコードが類似しているため、パフォーマンスは同じだと思いますが、正しいですか?

4

2 に答える 2

13

ええ、それは本当です!ただし、ループで連結すると、動作が異なります。例えば

String str = "Some string";
for (int i = 0; i < 10; i++) {
  str += i;
}

newStringBuilderは、すべての単一ループ反復(strの初期値)で構築され、すべての反復の終わりに、初期String(実際にStringBuilderは初期値str)との連結が行われます。
したがって、文字列連結をループで操作する場合にのみ、自分でStringBuilderを作成する必要があります。

于 2013-03-18T22:25:23.290 に答える
0

主な違い(およびコンパイラがStringBuilder文字列の連結に使用する理由)Stringは不変であるのに対し、StringBuilderそうではないということです。

たとえば、s1 + s2 + s3文字列のみを使用して計算するには、s1の文字​​を2回コピーする必要があります。これは、を使用することで回避できます(回避できます)StringBuilder

この最適化は、JLSによって明示的に許可されています。

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

于 2013-03-18T22:25:26.893 に答える