ホームページ  >  記事  >  Java  >  Java の String StringBuilder と StringBuffer の詳細な紹介と使用例

Java の String StringBuilder と StringBuffer の詳細な紹介と使用例

黄舟
黄舟オリジナル
2017-03-06 10:12:491308ブラウズ

この記事では主に 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 を使用します。


2) パフォーマンスが非常に低下するため、頻繁なスプライシングには String クラスの「+」を使用しないでください。これは Java 最適化における重要な原則です。例:


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 は主にグローバル変数で使用されます。


4) StringBuffer を使用する場合と比較して、StirngBuilder を使用すると、同じ状況下で約 10% ~ 15% のパフォーマンス向上しか達成できませんが、マルチスレッドのセキュリティが確保されないリスクがあります。実際のモジュールプログラミングでは、特定のモジュールを担当するプログラマが、そのモジュールがマルチスレッド環境で実行されるかどうかを必ずしも明確に判断できるとは限りません。したがって、システムのボトルネックが StringBuffer にあると判断されない限り、次のようになります。 StringBuilder は、モジュールがマルチスレッド モードで実行されない場合にのみ使用できることがわかります。それ以外の場合は、StringBuffer が引き続き使用されます。

上記は、Java の String StringBuilder と StringBuffer の詳細な説明と使用例を詳しく紹介しました。さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。