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(); } }
1) myeclipse で 10,000 回ループした場合: