2017-11-16 4 views
0
private static String buildSomeString(Map<String, String> data) { 
    StringBuilder result = new StringBuilder(); 
    for (Map.Entry<String, String> field : data.entrySet()) { 
     result.append("some literal") 
      .append(field.getKey()) 
      .append("another literal") 
      .append(field.getKey()) 
      .append("and another one") 
      .append(field.getValue()) 
      .append("and the last in this iteration"); 
    } 
    return result.toString(); 
} 

に関するエラーを与えると、コードの上にpmdを、私はこの上pmdを実行すると、私は次のエラーはStringBuilderのが初期化サイズおよび添付サイズ

StringBuffer constructor is initialized with size 16, but has at least 83 characters appended. 

を取得し、私はリテラルを変更されたため、文字の数は、おそらく間違って実行しています投稿する前にあなたはデフォルトの容量とStringBuilderを作成すると

おかげで

答えて

2

StringBuilderのコンストラクタでは、必要に応じて、使用する内部バッファのサイズでintを受け取ることができます。指定されていなければ、デフォルトは16です。

StringBuilderにデータを追加すると、必要に応じて自動的に内部バッファのサイズが変更されます。このサイズ変更は、新しい大きな配列を作成し、それに古いデータをコピーすることを意味します。これは「コストのかかる」操作です(大きな問題を抱えているバブルソートなどの悪いアルゴリズムを使用している場合は、これはマイクロ最適化です)。

予想される文字列のサイズをより正確に推測することで、そのような再割り当てを回避/最小化できます。

PMDはマップの内容を知りませんが、マップが空でない場合は、少なくとも83文字が含まれていることがわかります。あなたがより良いマップのキーと値の期待値に近づくことができる場合、これはさらに洗練することができ

StringBuilder result = new StringBuilder(83 * data.size()); // 83 or whatever you constant strings account for 

これは、次のような、サイズにより推測を行うことによって解決することができます。通常、実際の予想される出力をわずかに上回る方が、より多くのメモリを割り当てることを意味しても、再割り当てを完全に回避する可能性が高くなります。

1

、それは内部配列は、あなたがその能力を超えて追加する場合に拡張する必要があります。

作成する必要がある最終的な文字列の長さを知っている場合は、その容量のStringBuilderを作成することができます。そのため、多くの文字が必要であり、内部配列を拡張する必要はありません。

関連する問題