概要概要
String
:
文字列定数。文字列の長さは不変です。
StringBuffer
:
文字列変数(同期、つまりスレッドセーフ)。文字列の内容を頻繁に変更する場合は、効率上の理由からStringBufferを使用することをお勧めします。String型に変換する場合は、StringBufferのtoString()メソッドを呼び出すことができます。
主な操作は、追加メソッドと挿入メソッドです。
- appendメソッドは、常にこれらの文字をバッファーの最後に追加します。
- insertメソッドは、指定されたポイントに文字を追加します。
StringBuilder
:
文字列変数(スレッドセーフではありません)。内部的には、StringBuilderオブジェクトは、文字のシーケンスを含む可変長配列として扱われます。
このクラスは、StringBufferと互換性のあるAPIを提供しますが、同期を保証するものではありません。このクラスは、StringBufferの単純な置換として使用されるように設計されており、文字列バッファーが単一のスレッドによって使用される場合に使用されます(この状況は非常に一般的です)。
3つの違い
String
そしてStringBuffer
違いのタイプ:
Stringは不変オブジェクトであるため、Stringタイプが変更されるたびに、新しいStringオブジェクトが生成され、ポインターが新しいStringオブジェクトを指すため、コンテンツを頻繁に変更する文字列にはStringを使用しないことをお勧めします。
StringBufferクラスを使用する場合、新しいオブジェクトを生成してオブジェクト参照を変更する代わりに、StringBufferオブジェクト自体を操作するたびに。したがって、ほとんどの場合、特に文字列オブジェクトが頻繁に変更される場合は、StringBufferを使用することをお勧めします。
StringBuilder
そしてStringBuffer
、その違いは次のとおりです。
StringBufferはスレッドセーフですが、StringBuilderはスレッドセーフではありません。
同じ状況で、StringBuilderを使用すると、StringBufferを使用した場合と比較して約10%〜15%のパフォーマンスの向上しか得られませんが、マルチスレッドのセキュリティが低下するリスクがあります。
ほとんどの場合、StringBuilder> StringBufferです。これは主に、前者がスレッドセーフを考慮する必要がないためです。
戦略を使用する
(1)基本原則:少量のデータを操作する場合は、Stringを使用し、シングルスレッドで大量のデータを操作する場合はStringBuilderを使用し、マルチスレッドで大量のデータを操作する場合はStringBufferを使用します。
(2)頻繁なスプライシングにはStringクラスの「+」を使用しないでください。パフォーマンスが非常に低いため、Java最適化でより重要な原則であるStringBufferまたはStringBuilderクラスを使用する必要があります。
例えば:
String result = "";
for (String s : hugeArray) {
result = result + s;
}
// 使用StringBuilder
StringBuilder sb = new StringBuilder();
for (String s : hugeArray) {
sb.append(s);
}
String result = sb.toString();