この記事では、クラスの append メソッドとの
はい、間違いなくこの質問を深く掘り下げていない人は次のように言うでしょう。「まったく異なるクラスの新しいオブジェクトを作成して += 演算子を置き換えて、そのメソッドも呼び出す必要があるのはなぜですか
StringBuilder
演算子 の違いを考え、分析し、伝え、示したいと思います。ここで問題となるのは、アプリケーションの分野ではなく、コードの最適化です。 +=
String
toString()
? どのような最適性があるのでしょうか? 「何を言っているのですか?選択は明らかですが、何を言っているのですか?」そして彼は完全に間違っているでしょう。問題の 1 つは、String
それが原始的ではないことです。String
- Java の他のオブジェクトclass
と同様のオブジェクト。ご存知のとおり、Java では演算子のオーバーロードなどはありません (C++ などと同様)。演算子はプリミティブに対してのみ定義されており、どのクラスに対しても演算子をオーバーライドすることはできません。そのため、演算子 " +
" と " +
= " は Java ライブラリの一種の「松葉杖」であり、松葉杖は常に損失を引き起こします。実際、猫のしっぽを引っ張るのはやめて、測定に移りましょう。これは、ループ変数を使用して線を 100,000 回「接着」するのにかかる時間を測定する簡単なプログラムです。
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
String s = "Hello";
for(int i = 0; i < 100000; ++i)
{
s+=i;
}
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
私のコンピュータでは、コンソールに 6815ms と表示されました。つまり、コンピューターがこの線をつなぎ合わせるのにほぼ 7 秒かかりました。toString()
次に、これを StringBuilder に置き換えて、測定に メソッドを含めてみましょう。
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
StringBuilder sb = new StringBuilder("Hello");
for(int i = 0; i < 100000; ++i)
{
sb.append(i);
}
String s = sb.toString();
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
私のPCは10ミリ秒と言っていた。つまり0.01秒です。実際に使ってみると違いは明らかで、大まかに言って 700 倍append
速くなりました。これは、おそらく " +
" と " +=
" 自体が同じ追加を呼び出すことができますが、同時にそのような演算子が存在することとそれが何であるかを理解するために言語の初歩を長い道のりを経てきたという事実によるものです。すべきです (最後の段落は推測にすぎません。私は JVM 開発者ではないので、そこに何がどのようにあるのかわかりません)。これは、追加のオブジェクトが必ずしも高価であるわけではないという事実を示す明らかな例です。はい、コードは数行長くなりますが、大規模なプロジェクトでは膨大な時間の節約になる可能性があります。この測定は、先史時代のプロセッサを搭載したオフィスの PC で行われたものではないことに注意してください。しかし、この測定が、ほとんどスカーフを引っ張ることのできないまさにオフィスのコンピュータでどのような違いを生むかを想像してみてください。
GO TO FULL VERSION