1. 程式人生 > >String 和 StringBuffer的區別

String 和 StringBuffer的區別



String:
是物件不是原始型別.
為不可變物件,一旦被建立,就不能修改它的值.
對於已經存在的String物件的修改都是重新建立一個新的物件,然後把新的值儲存進去.
String 是final類,即不能被繼承.


StringBuffer:
是一個可變物件,當對他進行修改的時候不會像String那樣重新建立物件
它只能通過建構函式來建立,
StringBuffer sb = new StringBuffer();
note:不能通過付值符號對他進行付值. 
sb = "welcome to here!";//error
物件被建立以後,在記憶體中就會分配記憶體空間,並初始儲存一個null.向StringBuffer
中付值的時候可以通過它的append方法.
sb.append("hello");


字串連線操作中StringBuffer的效率要比String高:




String型別的字串裡面的內容不能修改,如需要修改,編譯器會新建立一個字串物件。
StringBuffer物件與String物件最大的不同在於StringBuffer不僅能修改字會串的長度,還能修改裡面的內容,此外,在多執行緒程式設計中,StringBuffer物件較為安全,StringBuffer類提供了很多對字串的修改操作,如append() 追加操作.


簡單一點說,最大根本區別:
String定義的物件申請的是固定記憶體,對String做任何操作它都會開闢新的記憶體空間
StringBuffer物件是可以變長的,所以StringBuffer是在原來地址上操作的








在java中有3個類來負責字元的操作。   
  
Character 是進行單個字元操作的,   
  
String 對一串字元進行操作。不可變類。   
  
StringBuffer 也是對一串字元進行操作,但是可變類。   
  
String:   
是物件不是原始型別.   
為不可變物件,一旦被建立,就不能修改它的值.   
對於已經存在的String物件的修改都是重新建立一個新的物件,然後把新的值儲存進去.   
String 是final類,即不能被繼承.   
  
StringBuffer:   
是一個可變物件,當對他進行修改的時候不會像String那樣重新建立物件   
它只能通過建構函式來建立,   
StringBuffer sb = new StringBuffer();   
note:不能通過付值符號對他進行付值.    
sb = "welcome to here!";//error   
物件被建立以後,在記憶體中就會分配記憶體空間,並初始儲存一個null.向StringBuffer   
中付值的時候可以通過它的append方法.   
sb.append("hello");   


字串連線操作中StringBuffer的效率要比String高:   
  
String str = new String("welcome to ");   
str += "here";   
的處理步驟實際上是通過建立一個StringBuffer,讓侯呼叫append(),最後   
再將StringBuffer toSting();   
這樣的話String的連線操作就比StringBuffer多出了一些附加操作,當然效率上要打折扣.   
  
並且由於String 物件是不可變物件,每次操作Sting 都會重新建立新的物件來儲存新的值.   
這樣原來的物件就沒用了,就要被垃圾回收.這也是要影響效能的.    
  
看看以下程式碼:   
將26個英文字母重複加了5000次,   
  
     String tempstr = "abcdefghijklmnopqrstuvwxyz";   
      int times = 5000;   
        long lstart1 = System.currentTimeMillis();   
        String str = "";   
        for (int i = 0; i < times; i++) {   
            str += tempstr;   
        }   
        long lend1 = System.currentTimeMillis();   
        long time = (lend1 - lstart1);   
        System.out.println(time);   
可惜我的計算機不是超級計算機,得到的結果每次不一定一樣一般為 46687左右。   
也就是46秒。   
我們再看看以下程式碼   
  
       String tempstr = "abcdefghijklmnopqrstuvwxyz";   
       int times = 5000;   
        long lstart2 = System.currentTimeMillis();   
        StringBuffer sb = new StringBuffer();   
       for (int i = 0; i < times; i++) {   
            sb.append(tempstr);   
        }   
        long lend2 = System.currentTimeMillis();   
        long time2 = (lend2 - lstart2);   
        System.out.println(time2);   
得到的結果為 16 有時還是 0  
所以結論很明顯,StringBuffer 的速度幾乎是String 上萬倍。當然這個資料不是很準確。因為迴圈的次數在100000次的時候,差異更大。不信你試試。   
  
    
  
根據上面所說:   
  
str += "here";   
的處理步驟實際上是通過建立一個StringBuffer,讓侯呼叫append(),最後   
再將StringBuffer toSting();   
  
所以str += "here";可以等同於   
  
StringBuffer sb = new StringBuffer(str);   
  
sb.append("here");  
  
str = sb.toString();   
  
所以上面直接利用"+"來連線String的程式碼可以基本等同於以下程式碼   
  
        String tempstr = "abcdefghijklmnopqrstuvwxyz";   
        int times = 5000;   
        long lstart2 = System.currentTimeMillis();   
        String str = "";   
        for (int i = 0; i < times; i++) {   
            StringBuffer sb = new StringBuffer(str);   
            sb.append(tempstr);   
            str = sb.toString();   
        }   
        long lend2 = System.currentTimeMillis();   
        long time2 = (lend2 - lstart2);   
        System.out.println(time2);   
平均執行時間為46922左右,也就是46秒。   
  
    
  
總結: 如果在程式中需要對字串進行頻繁的修改連線操作的話.使用StringBuffer效能會更高  






String型別的字串裡面的內容不能修改,如需要修改,編譯器會新建立一個字串物件,有時在程式設計中並不希望這樣,希望能改變字串物件裡的內容,就需要用StringBuffer類,即字串緩衝區類。
  StringBuffer物件與String物件最大的不同在於StringBuffer不僅能修改字會串的長度,還能修改裡面的內容,此外,在多執行緒程式設計中,StringBuffer物件較為安全
     StringBuffer類提供了很多對字串的修改操作,如append() 追加操作.
另外:String是物件不是原始型別,對一串字元進行操作,是不可變類;StringBuffer:是一個可變物件,也是對一串字元進行操作,但是可變類






  這兩個類都可以儲存和操作字串,即包含多個字元的字元資料。這個String類由於是被final修飾的,所以不可以被繼承,提供了數值不可改變的字串。而這個StringBuffer類提供的字串進行修改。當你知道字元資料要改變的時候你就可以使用StringBuffer類。典型地,你可以使用StringBuffers來動態構造字元資料。另外,String實現了equals方法,new String(“a”).equals(new String(“a”)的結果為true,而StringBuffer沒有實現equals方法,所以,new StringBuffer(“a”).equals(new StringBuffer(“a”)的結果為false。
    String還覆蓋了hashCode方法,而StringBuffer沒有覆蓋hashCode方法,所以,將StringBuffer物件儲存進Java集合類中時會出現問題。






String和StringBuffer,它們可以儲存和操作字串,即包含多 
個字元的字元資料。String類表示內容不可改變的字串。而StringBuffer類表示內容可以被 


修改的字串。當你知道字元資料要改變的時候你就可以使用StringBuffer。典型地,你可以 
使用 StringBuffers 來動態構造字元資料。另外,String 實現了 equals 方法,new 
String(“abc”).equals(newString(“abc”)的結果為true,而StringBuffer沒有實現equals方法,所以, 


newStringBuffer(“abc”).equals(newStringBuffer(“abc”)的結果為false。 


  接著要舉一個具體的例子來說明,我們要把1到100的所有數字拼起來,組成一個串。
StringBuffersbf=newStringBuffer(); 
  for(inti=0;i<100;i++) 
  { 


     sbf.append(i); 
  }
複製程式碼
上面的程式碼效率很高,因為只建立了一個StringBuffer物件,而下面的程式碼效率很低,因為 


  建立了101個物件。
  Stringstr=newString(); 
  for(inti=0;i<100;i++) 


  { 
     str=str+i; 
}
複製程式碼
在講兩者區別時,應把迴圈的次數搞成10000,然後用endTime-beginTime來比較兩者執行 
  的時間差異,最後還要講講StringBuilder與StringBuffer的區別。 


  String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode 
  方法,所以,將StringBuffer物件儲存進Java集合類中時會出現問題。








String型別的字串裡面的內容不能修改,如需要修改,編譯器會新建立一個字串物件,有時在程式設計中並不希望這樣,希望能改變字串物件裡的內容,就需要用StringBuffer類,即字串緩衝區類。
  StringBuffer物件與String物件最大的不同在於StringBuffer不僅能修改字會串的長度,還能修改裡面的內容,此外,在多執行緒程式設計中,StringBuffer物件較為安全


  StringBuffer類提供了很多對字串的修改操作


      如append() 追加操作.
       insert(int offset, value);  //插入操作
      replace(int start, int end, String str);  //替換操作,start 和 end都是整數,分別表示子串在原字串的起始位置和結束位置(不包括字串的結束位置)。str是一個字串物件,表示用於替換的內容。


  delete(int start ,int end);  //刪除操作 start 和 end都是整數,分別表示刪除的子串在原字串中的起始位置和結束位置(不包括結束位置的字元)






既然是道面試題就應該簡單又明確的表達:
第一物件上:String類物件儲存的內容固定,StringBuffer類物件可儲存可變內容(也就是可對內容進行操作)。
第二方法上:String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode 


這樣說簡潔明瞭嘿嘿
我的感覺哈