2012-01-25 4 views
2

可能性の重複:
java String concatenation
StringBuilder vs String concatenation in toString() in JavaStringBuffer append()またはString +?

私は(追記に関するいくつかの記事を読むVE)+よりもはるかに高速ですが、その理由は何ですか、なぜ私たちは+使用します上書きするありがとう!文字列はStringBuffer年代と同じ文字列上で動作し、それが速いと考えられている理由ですappend() Javaでimmutableあるよう

+3

http://stackoverflow.com/questions/47605/java-string-concatenationを見てください。ちょうどJavaの文字列の連結について検索します。これは何度も議論されているトピックです。 – yurib

+0

これは何度も尋ねられましたhttp://stackoverflow.com/q/4648607/776084 – RanRag

答えて

6

+は、新しい中間String ojectssを作成します。ただし、StringBufferよりも速いと言われているように、Java 5からのStringBuilderを使用する必要があります。その方法はStringBufferのように​​ではありません。

これは、高水準の理論的説明です。詳細については、String concatenation: concat() vs "+" operatorの投稿をご覧ください。

1

合計2文字列(ループなし)の場合、+を使用すると通常より高速です。 2つ以上の文字列を結合する場合、append()はより高速です。

違いは、文字列バッファーはchar []を内部的に使用し、余分な(空き)スペースが追加された新しいコンテンツを配置するために余分な(空き)スペースを持つことです(小さすぎると配列が大きくなります)。 +演算子は実際に正しい長さの新しい文字列を作成し、次に左辺と右辺をその中にコピーする必要があります。

2

コードが何千回もループして実行されない場合、+は完全に大丈夫です。何度も何度もメモリの再割り当てとルール、成長を続ける文字列、例外:長さ50の100個の言葉で

// fine: 
for (customer: list) 
    System.out.println ("Customer: " + customer); 

// prolematic for bigger lists: 
for (word: list) 
    chain += word; 

、あなたは長さ50、100、150で終わる、... 5000 - 完全に250 000文字、ガベージコレクションのための多くの作業。

1

JDK 1.5以降でコンパイルする場合、連結はStringBufferではなくStringBuilderになります。 StringBuilderは、ローカル変数の連結に最適化されています(つまり、ロックフリーです)。上記のGreg Mattesのリンクはおそらくあなたが本当に求めていた質問です。

関連する問題