この記事では主に Java の String StringBuilder と StringBuffer の詳細な説明と使用例を紹介します。必要な方は参考にしてください。
Android/Java 開発では、文字列を処理するためによく使用される 3 つのクラスがあります: String 、 StringBuilder 、 StringBuffer 。 。
それらの類似点と相違点:
1) これらはすべて最終クラスであり、継承は許可されません。
2) StringBuffer と StringBuilder の長さは可変です。 3) StringBuffer はスレッド セーフですが、StringBuilder はスレッド セーフではありません。
String VS StringBuffer
String 型と StringBuffer の主なパフォーマンスの違い: String は不変オブジェクトであるため、String 型が変更されるたびに、新しい String オブジェクトが生成され、ポインタは新しい String オブジェクトを指すため、頻繁に内容を変更する文字列には String を使用しないことをお勧めします。オブジェクトが生成されるたびに、特にメモリ内に参照されていないオブジェクトが多すぎる場合、システムのパフォーマンスに影響を与えるためです。 、JVM の GC が動作し始め、パフォーマンスが低下します。 StringBuffer クラスを使用する場合、新しいオブジェクトを生成したりオブジェクト参照を変更したりするのではなく、毎回 StringBuffer オブジェクト自体に対して操作が実行されます。したがって、ほとんどの場合、特に文字列オブジェクトが頻繁に変更される場合には StringBuffer を使用することをお勧めします。 一部の特殊なケースでは、String オブジェクトの文字列連結は、Java コンパイラーによって実際に StringBuffer オブジェクトの連結にコンパイルされるため、このような場合、String オブジェクトの速度は StringBuffer オブジェクトよりも遅くなりません。例:
String s1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);String s1 オブジェクトの生成速度は StringBuffer よりも遅くありません。実際、Java コンパイラでは、次の変換が自動的に行われます。 Java コンパイラは、上記の最初のステートメントを次のように直接コンパイルします。
String s2 = “This is only a”; String s3 = “ simple”; String s4 = “ test”; String s1 = s2 + s3 + s4;このとき、Java コンパイラは、元の方法でそれを実行します。つまり、String の +) 操作は StringBuilder (または StringBuffer) の append メソッドを使用して実装されます。このとき、s2、s3、s4 が String で定義されている場合は、追加の StringBuffer (または StringBuilder) が必要です。 StringBuffer を String に変換する必要があります。StringBuffer (または StringBuilder) を使用する場合は、追加の StringBuffer を作成する必要はありません。
StringBuilder
StringBuilder は 5.0 の新機能です。このクラスは StringBuffer 互換の API を提供しますが、同期は保証されません。このクラスは、文字列バッファーが単一スレッドによって使用される場合 (これが一般的な状況です)、StringBuffer のドロップイン置換として設計されています。ほとんどの実装では StringBuffer よりも高速であるため、可能であればこのクラスを優先することをお勧めします。どちらの方法も基本的には同じです。使用方法
1) 基本原則: 少量のデータを操作したい場合は String を使用し、単一のスレッドで大量のデータを操作したい場合は StringBuilder を使用します。複数のスレッドで大量のデータを処理する場合は、StringBuffer を使用します。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();上記の状況が発生した場合、明らかに 2 番目のメソッドを使用する必要があります。これは、最初のメソッドでは、結果を保存するためにループが使用されるたびに String 結果が作成されるためです。さらに、2 番目のメソッドも基本的には同じです。3) StringBuilder は通常、「+」と同様の関数を完了するためにメソッド内で使用されます。これはスレッド安全ではないため、使用後に破棄できます。 StringBuffer は主にグローバル変数で使用されます。