2016-03-30 24 views
3

次のようなコード行があります。ここで私の質問はどれが好きですか?文字列変数の連結

public static String convertMapToString (Map < String, String > map) 
{ 
    StringBuilder str = new StringBuilder (200) ; 
    for (Entry < String, String > entry : map.entrySet ()) 
    { 
     str.append (entry.getKey() + " = " + entry.getValue()) ; 
    } 
    return str.toString() ; 
} 

または私はappned文は上記の各反復で+操作 の結果として、2つの以上の追加の文字列を作成することを疑うので、私は次のように行く必要があります。従来の知恵によって

public static String convertMapToString (Map < String, String > map) 
{ 
    StringBuilder str = new StringBuilder (200) ; 
    for (Entry < String, String > entry : map.entrySet ()) 
    { 
     str.append (entry.getKey()); 
     str.append (" = "); 
     str.append (entry.getValue()) ; 
    } 
    return str.toString() ; 
} 
+4

両方のバージョンを逆コンパイルして、コンパイラがそれらを使って何をしたかを見てください。 – Tom

+2

2番目のスニペットは最初のスニペットより少ないStringオブジェクトを生成する可能性が高いので、私はそれを好むでしょう。 – Eran

+0

@Tom合意したように、文字列を連結する必要があり、 'StringBuilder'は同じ数の' char'をループしなければならないので、オプション番号2は "より良い"ということです。したがって、オプション1はオプション2と同じように見えますが、余分な不必要な連結があります – Maljam

答えて

3

それはあなたの例ではオプション2となるので、最適なStrings連結のためにあなたは、StringBuilder.append方法を選ぶべきです。 language specに応じて、あなたが"+"連結を使用しない場合でも、実装StringBuilder.appendにそれらを最適化することを選択するかもしれないが、それは保証されませんですので、最適な実行は、あなたの最初の優先事項であるならば、私はいつもオプション2を選択することをお勧め

注意。

+0

そのスペックリンクをありがとう – SacJn

+0

@SacJn - あなたは大丈夫です – Jas

0

バージョン2は、バージョン1が不必要にオブジェクトの束を作成し、著しく遅く実行するため、2が推奨されます。

文字列連結は、新しいStringBuilderを作成するためにコンパイルされ、各部品のappendを呼び出してからtoStringを呼び出します。

1

読みやすくするために、最初のもの。パフォーマンスのため

:第1

第二のコードは、以下のオブジェクトを生成するので、高速に、より少ないメモリを使用する必要があります。 (コンパイラはStringBuildersを使用するようにコードを最適化しようとしますが、@Jasのように:それは保証されません)

今、それを知って、あなたが必要とするものを使用するか、

私は通常、ループ内でのみStringBuilderを使用し、それらの外側では文字列の追加を行います。

+1

しかし、使用されたメモリとすべて:これはそうかもしれないと思うか、実際にコンパイルした結果を比較したことがありますか? – Tom

+2

あなたは固めです、@トム、私はレスポンスを編集しました。同じパフォーマンスと同じコンパイル済みコードがサポートされていますが、保証はされていません。したがって、StringBuilderを使用するかどうかを確認したい場合は、自分でコードに記述するか、コンパイルしたすべてのコードをコンパイルしてコンパイルしてください(コンパイラを変更した場合は明らかに)。 ループ内のStringBuildersと単純な関数とそれらの外側に文字列を追加するためです。 – inigoD