Java の StringBuilder、StringBuffer、および String クラス間の関係についての包括的な説明

高洛峰
リリース: 2017-01-22 11:39:57
オリジナル
1530 人が閲覧しました

1. String クラス

String の値は不変であるため、String に対する各操作で新しい String オブジェクトが生成され、非効率であるだけでなく、限られたメモリ空間を大量に浪費します。
String a = "a"; //a がアドレス 0x0001 を指すと仮定します
a = "b";//再割り当て後、a はアドレス 0x0002 を指しますが、アドレス 0x0001 に保存された「a」はまだ存在しますが、存在しません。 a が指されている場合、a はすでに他のアドレスを指しています。
つまり、文字列操作は、値を変更するのではなく、割り当てアドレスを変更することを意味します。

2. StringBuffer は可変クラスであり、それが指す文字列に対する操作は新しいオブジェクトを作成しません。 各 StringBuffer オブジェクトには一定のバッファ容量があり、文字列サイズがその容量を超えない場合、新しい容量は割り当てられません。

StringBuffer buf=new StringBuffer(); //16バイトの文字バッファを割り当てます
StringBuffer buf=new StringBuffer(512); //512バイトの文字バッファを割り当てます
StringBuffer buf=new StringBuffer(" これはテストです")//文字列をバッファに保存し、後で 16 バイトの空のバッファを予約します。

3. StringBuffer
StringBuffer クラスと StringBuilder クラスの機能は基本的に似ています。主な違いは、StringBuffer クラスのメソッドがマルチスレッドで安全であるのに対し、StringBuilder クラスは若干安全ではないことです。もっと早く。値が頻繁に変更される文字列の場合は、StringBuffer クラスと StringBuilder クラスを使用する必要があります。

4. スレッドの安全性
StringBuffer のスレッドの安全性
StringBuilder のスレッドの安全性

5. 速度
一般に、速度は、StringBuilder>StringBuffer>String の順であり、この比較は絶対的なものではありません。

6. 概要
(1). 少量のデータを操作したい場合は、= String
(2) を使用して、大量のデータを操作します。文字列バッファのマルチスレッド操作 大量のデータの操作 = StringBuffer

以下はコードとデモの手順です:

public class TestCharacter { 
final static int time = 50000; //循环次数 

public TestCharacter(){ 

} 
public void test(String s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s += “add”; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test(StringBuffer s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s.append(“add”); 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getCanonicalName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test(StringBuilder s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s.append(“add”); 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 

/*对 String 直接进行字符串拼接的测试*/ 
public void test2(){ 
String s2 = “abcd”; 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
String s = s2 + s2 +s2; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作字符串对象引用相加类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test3(){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
String s =”abcd” + “abcd” + “abcd”; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作字符串相加使用的时间为:”+(over-begin)+”毫秒”); 
} 
public static void main(String[] args){ 
String s1 = “abcd”; 
StringBuffer st1 = new StringBuffer(“abcd”); 
StringBuilder st2 = new StringBuilder(“abcd”); 
TestCharacter tc = new TestCharacter(); 
tc.test(s1); 
tc.test(st1); 
tc.test(st2); 
tc.test2(); 
tc.test3(); 
} 
}
ログイン後にコピー

このコードを myeclipse と dos の両方で実行したところ、出力された時間は多少異なりました。結果は次のとおりです:

1) myeclipse で 10,000 回ループした場合:

Java の StringBuilder、StringBuffer、および String クラス間の関係についての包括的な説明

2) myeclipse で 50,000 回ループした場合:

Java の StringBuilder、StringBuffer、および String クラス間の関係についての包括的な説明

3) DOS で実行した場合:

Java の StringBuilder、StringBuffer、および String クラス間の関係についての包括的な説明

より包括的な説明Java の StringBuilder、StringBuffer、および String クラスの違いについて説明します。関係関連の記事については、PHP 中国語 Web サイトに注目してください。


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート