String と StringBuffer の違いについては誰もがよく理解していると思いますが、これら 2 つのクラスの動作原理についてはまだよくわかっていない人も多いと思われます。今日はこの概念を皆さんのために復習します。 J2SE 5.0 が新しい文字操作クラス StringBuilder を導入する方法です (急いでレンガを投げないでください。私はまだ冷静です。ここでは C# について話しているのではありません。Java にも StringBuilder クラスがあります)。では、この StringBuilder および StringBuffer と、最初に出会った String クラスとの違いは何でしょうか?さまざまな状況でどれを使用する必要がありますか?これらのカテゴリーについて私の意見を共有したいと思います。また、誰もが間違いを犯しているので、それを修正しながら学ぶ良い機会になることを願っています。
簡単に言うと、String 型と StringBuffer 型の主なパフォーマンスの違いは、実際には String が不変オブジェクトであることです (なぜですか? Java の設計者に聞いてください。なぜ String がネイティブ型ではないのか?)。そのため、String 型が変更されるたびに、 , 実際、これは新しい String オブジェクトを生成し、その新しい String オブジェクトを指すポインタを指定することと同じです。したがって、オブジェクトが生成されるたびに内容が頻繁に変更される文字列には String を使用しないことをお勧めします。特にメモリ使用時に、JVM の GC が動作し始め、速度がかなり遅くなります。以下はあまり適切ではない例です。
文字列 S1 = "abc";
For(int I = 0; I < 10000; I ++) // For はプログラムの複数の呼び出しをシミュレートします
{
S1 + = "デフォルト";
S1 = "abc";
}
この場合、for ループが完了した後、メモリ内のオブジェクトが GC によってクリアされていない場合、メモリ内には 20,000 を超える驚くべき数が存在することになります。また、これが多くの人によって使用されるシステムの場合、数はそれほど多くありませんので、ご利用の際はご注意ください。
StringBuffer クラスを使用する場合、結果は毎回異なります。新しいオブジェクトを生成してオブジェクト参照を変更するのではなく、StringBuffer オブジェクト自体に対する操作になります。したがって、一般に、特に文字列オブジェクトが頻繁に変更される場合には、StringBuffer を使用することをお勧めします。一部の特殊なケースでは、String オブジェクトの文字列連結は、実際には JVM によって StringBuffer オブジェクトの連結として解釈されるため、このような場合、String オブジェクトの速度が StringBuffer オブジェクトの速度よりも遅くなることはなく、特に次の文字列オブジェクトはその中で、String の効率は StringBuffer よりもはるかに高速です。
文字列 S1 = 「これは単なる」 + 「単純」 + 「テスト」;
StringBuffer Sb = new StringBuilder("これは単なる").append("シンプル").append("テスト");
String S1 オブジェクトの生成速度が単純に速すぎることに驚くでしょう。現時点では StringBuffer には速度の点でまったく利点がありません。実際、これは JVM のトリックです。
String S1 = “This is just a” + “simple” + “test”; 実際には、次のようになります。 String S1 = “This is just a simple test”; したがって、もちろん、それほど時間はかかりません。ただし、ここで誰もが注意すべきことは、文字列が別の String オブジェクトからのものである場合、速度はそれほど速くないということです。たとえば、次のとおりです。
文字列 S2 = “これは単なる a”;
文字列 S3 = "単純";
文字列 S4 = "テスト";
文字列 S1 = S2 +S3 + S4;
この時点では、JVM は元の方法で動作するため、S1 オブジェクトの生成速度は以前ほど速くなくなります。後でそれを検証するためのテストを行うことができます。
これから、最初のステップの結論が得られます。ほとんどの場合、StringBuffer > String
そして、StringBuilder はそれらとどう違うのでしょうか?まず簡単に紹介します。StringBuilder は JDK5.0 で新しく追加されたクラスです。StringBuffer との違いは次のとおりです (出典: JavaWorld)。
Java.lang.StringBuffer スレッドセーフな変更可能な文字シーケンス。 String に似た文字列バッファですが、変更できません。文字列バッファは複数のスレッドで安全に使用できます。これらのメソッドは必要に応じて同期できるため、特定のインスタンスに対するすべての操作が、関連する各スレッドによって行われるメソッド呼び出しの順序と一致するシリアル順序で発生するように見えます。
各文字列バッファには一定の容量があります。文字列バッファーに含まれる文字シーケンスの長さがこの容量を超えない限り、新しい内部バッファー配列を割り当てる必要はありません。内部バッファがオーバーフローした場合、この容量は自動的に増加します。 JDK 5.0 以降、シングル スレッドで使用するための同等のクラス StringBuilder がこのクラスに追加されました。 StringBuilder クラスは、すべて同じ操作をサポートしますが、同期を実行しないため高速であるため、通常はこのクラスよりも優先して使用する必要があります。
ただし、複数のスレッドで StringBuilder のインスタンスを使用するのは安全ではありません。このような同期が必要な場合は、StringBuffer を使用することをお勧めします。
そうは言っても、両者の違いは誰でも理解できると思いますので、以下に一般的な導出を行ってみましょう。
ほとんどの場合、StringBuilder > StringBuffer
したがって、この不等式の伝達定理によれば、ほとんどの場合、StringBuilder > StringBuffer > String (操作の数が多いほど安定します)。
実行中のミリ秒値を知るには、システム時刻を取得します。
for(i=0;i<str.length()/2;i++)
if(str.charAt(i)!=str.charAt(str.length()-i-1))
壊す;
if(i>=str.length()/2)
JOptionPane.showMessageDialog(null,"は回文文字列です");
それ以外
JOptionPane.showMessageDialog(null, "回文文字列ではありません");
}
}
*/
if(str.equals(str2))
JOptionPane.showMessageDialog(null,"は回文文字列です");
それ以外
JOptionPane.showMessageDialog(null, "回文文字列ではありません");
}
}