string,stringBuffer,stringBuild區別與聯系


(1)string

       1,Stirng是對象不是基本數據類型 
       2,String是final類,不能被繼承。是不可變對象,一旦創建,就不能修改它的值。 
       3,對於已經存在的Stirng對象,修改它的值,就是重新創建一個對象,然后將新值賦予這個對象 

 不可改變的Unicode字符序列
池化思想,把需要共享的數據放在池中,用一個存儲區域來存放一些公用資源  以減少存儲空間的開銷。
在String類中,以字面值創建時,會到Java方法空間的串池中去查找,如果沒有則會在串池里創建一個字符串對象,並返回其地址賦給對象變量,如果有就返回串池中字符串的地址,並把這個地址賦給對象變量。
如果是new,則會在堆空間中創建String類的對象,不會有上述的過程
如:
String s1 = "abc";  //新創建,字符串常量池中沒有該串,則會在池中創建一個串"abc"
String s2 = "abc";  //串池中已經存在"abc",則s2會去指向"abc"而不會去創建一個新的
    String s3 = new String("abc");  //直接在堆中去開辟一個新的空間,而不會去池中查找
類中的具體方法查看下Api文檔。
調用任何String中的方法,不會改變String自身,除非重新賦值。

 

(2)stringBuffer

   1,一個類似於 String 的字符串緩沖區,對它的修改的不會像String那樣重創建對象。 
   2,使用append()方法修改Stringbuffer的值,使用toString()方法轉換為字符串。

   3,線程安全,效率低 

 可改變的Unicode字符序列
允許並發操作,是線程安全的
String類在進行字符串連接時會顯得效率很低,就是因為它所產生的對象的屬性是不能夠修改的,當連接字符串時也就只能創建新的對象。
對於很多字符串連接時,應當使用StringBuffer類,使用這個類的對象來進行字符串連接時就不會有多余的中間對象生成,從而優化了效率。
例:對於字符串連接String str = "A" + "B" + "C" + "D";
產生:"AB"、"ABC"、"ABCD"
在串池中產生的"AB"、"ABC"明顯是多余對象,浪費空間。
                     解決方案:
String s = null;
StringBuffer sb = new StringBuffer("A");
sb.append("B");
sb.append("C");
sb.append("D");
s = sb.toString();
 

(3)stringBuild

       是jdk1.5后用來替換stringBuffer的一個類,大多數時候可以替換StringBuffer。和StringBuffer的區別在於Stringbuild是一個單線程使用的類,

  不執行線程同步所以比 StringBuffer的速度快,效率高。是線程非安全的。

 

可改變的Unicode字符序列
操作同StringBuffer,只是不支持並發操作,非線程安全
 

(4)區別,聯系

使用舉例 
String s1 = “hello”; 
s1=“world”; 
這個操作其實是:其實是創建了兩個String對象。 
String s2 = "hello" 
s2 += "world"; 
這操作是:先創建一個String對象,在接下來進行字符串連接的時候,有創建了一個StringBuild(jdk1.5前是StringBuffer),然后調用append()方法,最后調用toString()方法。 
有此可以看出String對字符的操作比直接使用Stringbuffer(或者StringBuild)要多出附加的操作,而且String是不可變對象,使用String對字符串操作會產生大量的、多余java對象。所以結果是:影響性能,占用空間。 
程序舉例: 
分別使用String和StringBuffer對字符串“0123456789”累加10000次,然后統計耗時多長 

        String str = "0123456789"; 
        String str2 = ""; 
        int count = 10000; 
        long start = System.currentTimeMillis(); 
        for (int i = 0; i < count; i++) { 
            str2 += str; 
        } 
        long end = System.currentTimeMillis(); 
        long time = (end - start); 
        System.out.println(time); 
運行多次,在我的機器上平均時間約等於3300,即3.3秒,下面用StringBuffer來操作,查看結果 
String str = "0123456789"; 
StringBuffer sb = new StringBuffer(); 
int count = 10000; 
long start = System.currentTimeMillis(); 
for (int i = 0; i < count; i++) { 
sb.append(str); 

String str2 = sb.toString(); 
long end = System.currentTimeMillis(); 
long time = (end - start); 
System.out.println(time); 
同樣在我的機器上結果平均結果小於10,即0.01秒,兩者相差300多倍,而且隨着循環次數的增加這個差距逐漸增大 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM