Java String、StringBuilder、StringBuffer


String vs StringBuilder vs SringBuffer


https://ifuwanna.tistory.com/221

| String vs StringBuffer/StringBuilder


StringとStringBuffer/stringBuilderクラスの最大の違いは、Stringが不変の属性を持っていることです.
String str = "hello"; // String str = new String("hello"); 
str = str + " world"; // [ hello world ]
上記の直感的で最も一般的な例では、Stringクラスの参照変数strが「hello」文字列をその指向位置に格納された「hello」に追加し、「hello world」に変更すると考えられます.
ただし、既存の「hello」値を含むStringクラスの参照変数strは、「hello world」値を持つ新しいメモリ領域を指すように変更され、最初に「hello」と宣言されたメモリ領域はGarbageのままとなり、GC(ゴミ回収)によって破棄されます.Stringクラスは変更されないため、文字列の変更時に新しいStringインスタンスが作成されます.

Stringには不変性があるため、不変の文字列を頻繁に取得する場合は、Stringを使用してパフォーマンスを向上させることができます.ただし、文字列の追加、変更、削除などを頻繁に実行するアルゴリズムでStringクラスを使用すると、スタックメモリ(heap)に大量の一時ゴミが生成され、スタックメモリが不足し、アプリケーションのパフォーマンスに深刻な影響を及ぼします.
このためJavaには、可変属性を持つStringBuffer/stringBuilderクラスが導入されています.
Stringとは反対にStringBuffer/stringBuilderは可変性を有するappend() .delete()などのAPIを使用して、同じオブジェクト内で文字列を変更できます.文字列を頻繁に追加、変更または削除する場合は、StringクラスではなくStringBuffer/stringBuilderを使用します.

StringBuffer vs StringBuilder


最大の違いは、同期がないことです.StringBufferは同期キーワードをサポートし、マルチスレッド環境では安全です(thread-safe).Stringは、不変性を有するため、マルチスレッド環境における安定性(thread−safe)も同様であることに注意してください.
StringBuilderは同期をサポートしていないため、マルチスレッド環境では使用できませんが、同期を考慮しないため、単一スレッドではStringBufferよりもパフォーマンスが優れています.