4

私はコンピューター サイエンス プロジェクトを行っており、StringBuffers を組み込む必要があります。.appendconcatenate が何を意味し、何を意味するかについて助けが必要です。.appendwithを使用すると、(私のゲームの) 勝者を示すことができると誰かが私に言いましたStringBuffer

  public static void winner ()
  {
    if (position1 >= 100){
      System.out.println("THE WINNER IS " + name1); 
    }
    else if (position2 >= 100){
      System.out.println("THE WINNER IS " + name2); 
    }
  }

名前を文字列として持つ代わりに、StringBuffer誰がゲームに勝ったかを出力するために使用できますか?

4

7 に答える 7

7

コンパイラのおかげで、あなたはすでにStringBuilderのより新しく高速なバージョンの を使用していますStringBuffer

上記のコードは、次と同等のものにコンパイルされます。

public static void winner ()
{
  if (position1 >= 100){
    System.out.println(new StringBuilder("THE WINNER IS ").append(name1).toString()); 
  }
  else if (position2 >= 100){
    System.out.println(new StringBuilder("THE WINNER IS ").append(name2).toString()); 
  }
}

したがって、この場合、まだ行われていないことを達成することはできません。をループ内にStringBuilder構築する場合に使用します。String

あなたの状況では、おそらく両方のケースで単一の StringBuilder を事前に初期化することについて話していました。

public static void winner() {
  StringBuilder out = new StringBuilder("THE WINNER IS ");
  if (position1 >= 100) {
    out.append(name1);
  } else if (position2 >= 100 {
    out.append(name2);
  } else {
    return; // Preserve previous behavior just in case, remove this if it's not needed
  }
  System.out.println(out);
}
于 2013-01-11T22:51:28.057 に答える
3

あなたはおそらく次のようなものが欲しいでしょう:

  public static void winner ()
  {
      StringBuffer sb = new StringBuffer("THE WINNER IS ");

      if (position1 >= 100)
          System.out.println(sb.append(name1).toString());
      else if (position2 >= 100)
          System.out.println(sb.append(name2).toString());
  }

ただし、StringBufferへのアクセスが同期されるため、通常、StringBuilderはStringBufferよりも優先されます。

于 2013-01-11T22:57:41.010 に答える
1

System.out.printlnその引数をString自動的に に変換するため、結果としてStringBuffer. ほとんどの場合、一連のデータを反復する必要があるときに使用します。

メソッドを使用appendすると、バッファにデータを追加できます。

String[] values = { 'string value', 'testing' };
StringBuffer sb = new StringBuffer();
for(String value: values) {
    sb.append(value);
}

結果は -->string valuetesting

注:StringBuilder代わりに検討することをお勧めします。

于 2013-01-11T22:46:45.867 に答える
1

小さな文字列の追加と連結は、通常、使用してもあまりメリットがありませんStringBuilderが、文字列の追加には 3 つの操作、追加された両方の文字列のサイズからなる 1 つの新しい割り当て、および内容をコピーするための 2 つのコピー操作があることに注意してください (これは、メモリに 3 つの文字列があることを意味します)、StringBuilderほとんどの場合 1 つのコピーしか必要としない固定幅のバッファーに追加してサイズ変更するだけです (償却コスト コピー、場合によっては 2 かかるサイズ変更が必要になります)。1 つの文字列に多くを追加する場合は、StringBuilder代わりに使用することをお勧めしますが、あなたのような連結では、パフォーマンスが低下することはありません (少なくとも測定可能)。

于 2013-01-11T22:48:59.583 に答える
1

StringBufferorを使用するのStringBuilderは、以下に示すように、文字列の連結が繰り返されるのを避けるためです。

String result = "";
for (int i = 0; i < 200; i++) {
    result = result + i + ",";
}

これは効率的ではありません。ループごとに 1 つの String オブジェクトが (内部的に Java で) 作成されます。

StringBuilder / StringBuffer の使用:

StringBuilder buf = new StringBuilder(200); // init with a estimation of length has advantage
for (int i = 0; i < 200; i++) {
    buf.append(i).append(",");
}
String result = buf.toString();

これにより、各ループでの不要な文字列の作成が回避され、バッファが文字でいっぱいになり、必要に応じてバッファのサイズが変更されます。

ただし、あなたの場合、努力する価値はありません。

于 2013-01-11T22:53:29.290 に答える
0

はい、できます。誰もが指摘したように、StringBuffer.toString() は内容を文字列としてフラッシュします。自問する必要がある質問は、何を使用するかを本当に気にかけているのか、それとも特に何かを学ぶために StringBuffer を使用したいのかということです。

あなたの操作のために、一方は他方と同じくらい良いです。友達の言うことを本当にやりたいのなら、ここにいる人たちははっきりと答えていると思います。

または、友達に「それは問題ではない。私の場合は、一方が他方と同じくらい良い」と言うことができます:)

于 2013-01-11T23:21:23.160 に答える
0

同期されたバージョンの文字列を取得するには、スレッドセーフ性が高い StringBuffer を使用することをお勧めします。同期されていない場合は、スレッドセーフが不要な StringBuilder クラスを使用すると、アプリケーションのパフォーマンスが向上します..

于 2016-09-25T08:40:58.183 に答える