0

文字列リテラルとJavaのパフォーマンスの関係について知りたいのですが。

たとえば、以下のステートメントを何度も使用すると、パフォーマンスに影響があります。私には何千ものクラスがあり、多くの場合、以下のステートメントを使用しています。

1) buffer.append(",");
2) buffer.append("}");

3)String.append("10,000 times...same lines") // printing same lines in many classes
3)String.someStringMethod("same line many times") // using any String method 

これにより、メモリ管理などのパフォーマンスに影響がありますか?よりクリーンな方法はありますか?

ありがとう

4

2 に答える 2

3

意味のない例についてコメントするのは本当に難しいです。でも:

  • 一般に、Java 文字列リテラルには特に効率上の懸念はありません。
  • 一般に、文字列リテラルを引数として受け取るメソッドには、効率に関する特別な懸念はありません。
  • 特定のコードが十分に頻繁に実行される場合、文字列の連結/構築は効率の問題を引き起こす可能性があります。ただし、文字列を作成する必要がある場合、できることはあまりありません。

回避するための措置を講じる価値のあることが 1 つまたは 2 つあります。主なものはこれです:

   String s = "";
   for (/* lots of times */) {
       // do stuff
       s += someOtherString;
   }

問題は、これが大量の一時文字列を生成して破棄することです。それを行うためのより効率的な方法は次のとおりです。

   StringBuilder sb = new StringBuilder();
   for (/* lots of times */) {
       // do stuff
       sb.append(someOtherString);
   }
   String s = sb.toString();

ただし、プロファイラーがこの特定のコードがボトルネックであると通知した場合にのみ、この種のものを最適化する価値があります。

于 2013-01-26T09:48:05.430 に答える
1
  1. 記述したコードはパフォーマンスに影響するため、2 つの追加ではなく、",}" を使用して 1 つの append() を呼び出すことを常にお勧めします。

  2. java.lang.String クラスにはメソッド append がありません。

  3. String オブジェクトを変更する String メソッドはありません。代わりに、String.substring()、String.concat()、String.replace() などのメソッドが新しい String オブジェクトを作成します。これは、StringBuffer を使用する場合よりもパフォーマンスが大きく影響を受けることを意味します。

  4. したがって、一般的に StringBuffer メソッドは String のメソッドよりも高速です。ただし、最近 StringBuilder と呼ばれる新しいクラスが導入されました。StringBuilder との違いは 1 つだけです。スレッドセーフではないということです。実際のケースでは、スレッド管理はより高いレベルのコンテナーで処理されるため、各クラスのスレッド セーフを保証する必要はありません。そのような場合は、StringBuilder を使用することをお勧めします。それが最速のはずです。

  5. StringBuilder のパフォーマンスをさらに向上させるには、結果の文字列の長さを認識して、適切なサイズの StringBuilder を割り当てる必要があります。大きすぎるとメモリを浪費しますが、通常は小さな問題です。ただし、小さすぎる場合、StringBuilder は内部文字配列を再作成して、より多くの文字用のスペースを確保する必要があります。これにより、その特定の append() 呼び出しが遅くなります。実際、遅いのは呼び出しではなく、メモリをクリーンアップするために呼び出されるガベージ コレクションです。

  6. String クラスの特定のメソッドは、StringBuffer/StringBuilder のメソッドよりも優れているか高速である可能性がありますが、私がそれに答えるには、質問をより具体的にする必要があります。

于 2013-01-26T09:55:25.923 に答える