String,StringBuffer,StringBuilder

1. String 類 
  String的值是不可變的,這就導致每次對String的操作都會生成新的String對象,不僅效率低下,而且大量浪費有限的內存空間。 
String a = "a"; //假設a指向地址0x0001 
a = "b";//重新賦值後a指向地址0x0002,但0x0001地址中保存的"a"依舊存在,但已經不再是a所指向的,a 已經指向了其它地址。 

因此String的操作都是改變賦值地址而不是改變值操作。 


2. StringBuffer是可變類,和線程安全的字符串操作類,任何對它指向的字符串的操作都不會產生新的對象。 每個StringBuffer對象都有一定的緩衝區容量,當字符串大小沒有超過容量時,不會分配新的容量,當字符串大小超過容量時,會自動增加容量。 

StringBuffer buf=new StringBuffer(); //分配長16字節的字符緩衝區 
StringBuffer buf=new StringBuffer(512); //分配長512字節的字符緩衝區 
StringBuffer buf=new StringBuffer("this is a test")//在緩衝區中存放了字符串,並在後面預留了16字節的空緩衝區。 

3.StringBuilder 
  StringBuffer和StringBuilder類功能基本相似,主要區別在於StringBuffer類的方法是多線程、安全的,而StringBuilder不是線程安全的,相比而言,StringBuilder類會略微快一點。對於經常要改變值的字符串應該使用StringBuffer和StringBuilder類。 

4.線程安全 
StringBuffer 線程安全 
StringBuilder 線程不安全 

5.速度 
一般情況下,速度從快到慢:StringBuilder>StringBuffer>String,這種比較是相對的,不是絕對的。 


6.總結 
(1).如果要操作少量的數據用 = String 
(2).單線程操作字符串緩衝區 下操作大量數據 = StringBuilder 

(3).多線程操作字符串緩衝區 下操作大量數據 = StringBuffer 

以下是測試代碼

7.補充StringBuffer和StringBuilder擴容問題。

 StringBuffer buf=new StringBuffer(); //分配長16字節的字符緩衝區 
 StringBuffer buf=new StringBuffer(512); //分配長512字節的字符緩衝區 
 StringBuffer buf=new StringBuffer("this is a test")//在緩衝區中存放了字符串,並在後面預留了16字節的空緩衝區。

你可以通過StringBuffer和StringBuilder裏面的方法進行擴容,即ensureCapacity()可以進行擴容,擴容後的大小爲原始大小*2+2。

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(); 
} 
} 

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章