String、StringBuilder、StringBufferの違い-パフォーマンスの観点


Javaで処理される文字列の代表クラスには、String、StringBuilder、StringBufferがあります.アプリケーションのパフォーマンスの観点から、3つのカテゴリから状況に合った適切なカテゴリを選択する必要があります.

1. String vs StringBuilder/StringBuffer


Stringは変わらない.つまり、Stringオブジェクトが作成されると、割り当てられたメモリ領域はそのままになり、文字列の変更時に新しいStringオブジェクト(インスタンス)が作成されます.
したがって、既存のStringオブジェクトの文字列に別の文字列を貼り付けると、新しい文字列は既存の文字列に追加されるフォーマットではありません.逆に、文字列は新しいStringオブジェクトに格納され、既存のStringオブジェクトへの参照変数は新しいオブジェクトのメモリ領域に格納されます.
その後、既存のStringオブジェクトに割り当てられたメモリ領域はゴミとして保持され、ゴミ収集オブジェクトとして消えます.
String str = "Hello";
str += "World";

これはStringクラスオブジェクトがHeapメモリ領域に作成されるためです.Heapメモリ領域の特性上、生成されたオブジェクトの内容を一度に変更することはできません.これはゴミ収集が機能する領域であるため、既存のオブジェクトが削除されるとJavaのゴミ収集は回収されます.
したがって、あまり変化しない文字列を生成する場合は、Stringオブジェクトを使用します.しかし、文字列を頻繁に追加、削除、変更するアルゴリズムでStringクラスを使用すると、Heapメモリに大量の一時メモリが発生し、Heapメモリが不足し、アプリケーションのパフォーマンスに深刻な影響を及ぼします.
この問題を解決するためには、可変性を有するStringBuilder/stringBufferクラスを使用する必要がある.StringBuilder/stringBufferクラスは.append(), .delete()などのAPIを使用して、同じオブジェクト内で文字列を変更できます.したがって、文字列の変更が頻繁に発生する場合は、StringBuilder/stringBufferクラスを使用します.
StringBuffer sb= new StringBuffer("Hello");
sb.append(" World");

2. StringBuilder vs StringBuffer


同じAPIを持つStringBuilderとStringBufferの違いは、同期がユニークです.
StringBufferは同期をサポートし、マルチスレッド環境で安定しています.StringBuilderは同期をサポートしていないため、マルチスレッド環境では使用できませんが、同期を考慮しないため、単一スレッド環境ではStringBufferよりもパフォーマンスが優れています.
ちなみにStringは同期もサポートしているので、マルチスレッド環境に最適です.
そのため、以下のように整理することができます.
  • String:文字列演算量が小さくマルチスレッド環境の場合
  • StirngBuffer:マルチスレッド、文字列演算密集型環境の場合
  • StringBuilder:文字列の演算が多すぎて、単書きまたは同期を考慮する必要がない場合