String和StringBuffer的區別

原文地址 http://blog.163.com/icylzr@126/blog/static/24329362200822395045648/

String對象建立之後不能再改變,如果經常對字符串進行各種各樣的修改,那麼使用String來代表字符串的話會引起很大的內存開銷。
StringBuffer允許修改,不是每個不同的字符串都要生成一個新的對象,兩種類的對象轉換十分容易。

在我以前的瞭解中,String是一個final Class, StringBuffer不是。所以對於 String a = "yacht" ,String b = "yacht1" String c = a + b ; 存在一個對象拷貝構造和解析的消耗問題;對於一個StringBuffer來說,StringBuffer sb = new StringBuffer();sb.append("yacht") ; sb.append("yacht1"); 因爲StringBuffer是一個可以實例化的類,而且它的內建機制是維護了一個capacity大小的字符數組,所以它的append操作不存在對象的消耗問題,所以我覺得如果存在String連接這種事情,StringBuffer來做會好很多。

       但事情並不是這麼簡單,看下面代碼

String a = "yacht1" + "yacht2" + "yacht3" + "yacht4";

       StringBuffer sb = new StringBuffer(); sb.append("yacht1") ; sb.append("yacht2"); sb.append("yacht3") ; sb.append("yacht4");  String a = sb.toString();

如果按照我先前說的看法,紅色的效率肯定比藍色的低,但經過測試不是這樣,爲什麼?這裏,我們需要理解程序過程的兩個時期,一個是編譯時,一個是運行時,在編譯時,編譯器會對你的程序做出優化,所以紅色的String a會被優化成yacht1yacht2yacht3yacht4,而藍色的StringBuffer只會在運行時才處理。所以效率是不一樣的。

       如果代碼是這樣的:

       String a ; for(int i = 0; i< 100000;i++){ a += String.valueOf(i) ;}

       StringBuffer sb = new StringBuffer(); for(int i = 0; i< 100000;i++){ sb.append(i) ;} String a = sb.toString(); 

       如果是這種情況的話,紅色的效率就大大不如藍色,區別在哪裏,就在於運行時和編譯時的優化問題上!

 

 

前面看到有人寫String和stringBudffer的區別是前者是不能改寫的,後者是可以改寫的

  我覺得說String的字符串不能改變話是不錯,但是例子要舉好

  看看下面這個簡單的例子:

  首先,

 
public class xx {
  
public static void main(String[] args) 
{
  String s1 
= "You are hired!"
;
  String s2 
= "You are hired!"
;
  
if (s1==s2) 
{
  System.out.println(
"一個內存空間"
);
  }
 else {
  System.out.println(
"不是一個內存空間"
);
  }

  }

  }
打印的結果是:一個內存空間

  這裏==的意義是兩個操作數是否指向同一個對象

  可見s2在不用new創建的情況下會自動檢索到具有相同內容的內存空間中共享,那麼既然s1和s2共享了同一個對象

  再看下面的代碼

public class xx {
  
public static void main(String[] args) 
{ String s1 = "You are hired!";
  String s2 
= "You are hired!"
;
  s1 
= s1.replace('h','f'
);
  System.out.println(s1);
  
if (s1==s2) 
{
  System.out.println(
"一個內存空間"
);
  }
 else {
  System.out.println(
"不是一個內存空間"
);
  }

  }

  }

代碼結果是

  You are fired!

  不是一個內存空間

  可見,String中s1的內容雖然被改寫,但是已經不在是原來第一次分配到的那個內存空間,也就是String類的內容能被改變,但一旦改變系統將爲其分配新的內存

  說到與stringBuffer的區別,從根本上來說應該是

  stringBuffer在做字符長度變動的時候將繼續使用原來的內存空間,不新分配.

  而String的長度一旦變動,就如上面的例子一樣,其內部將分配新的內存空間.

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