首頁  >  文章  >  Java  >  全面解釋java中StringBuilder、StringBuffer、String類別之間的關係

全面解釋java中StringBuilder、StringBuffer、String類別之間的關係

高洛峰
高洛峰原創
2017-01-22 11:39:571490瀏覽

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.StringBuffer 
  StringBuffer和StringBuilder類別功能基本上都很相似,主要區別在於StringBuffer類別的方法是多執行緒、安全的,而StringBuilder不是執行緒安全的,相比而言,StringBuilder類別會略微快一點。對於經常要改變值的字串應該使用StringBuffer和StringBuilder類別。 

4.執行緒安全 
StringBuffer 執行緒安全 
StringBuilder 執行緒不安全 

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

6.總結 
(1).如果要操作少量的資料用= String 
(2).單執行緒操作字串緩衝區下操作大量資料= StringBuilder 
(3).多執行緒操作字串緩衝區下操作大量資料= 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下循環10000次時: 

全面解釋java中StringBuilder、StringBuffer、String類別之間的關係

2)myeclipse下循環50000次時:

全面解釋java中StringBuilder、StringBuffer、String類別之間的關係

3)在DOS下執行時:關係相關文章請關注PHP中文網!

全面解釋java中StringBuilder、StringBuffer、String類別之間的關係

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn