1. 程式人生 > >String,StringBuffer,StringBuilder 三者的區別

String,StringBuffer,StringBuilder 三者的區別

  最近學習到StringBuffer,心中有好些疑問,搜尋了一些關於String,StringBuffer,StringBuilder的東西,現在整理一下。

關於這三個類在字串處理中的位置不言而喻,那麼他們到底有什麼優缺點,到底什麼時候該用誰呢?下面我們從以下幾點說明一下

  1.三者在執行速度方面的比較:StringBuilder >  StringBuffer  >  String

  2.String <(StringBuffer,StringBuilder)的原因

    String:字串常量

    StringBuffer:字元創變數

    StringBuilder:字元創變數

    從上面的名字可以看到,String是“字元創常量”,也就是不可改變的物件。對於這句話的理解你可能會產生這樣一個疑問  ,比如這段程式碼:

1 String s ="abcd";
2 = s+1;
3 System.out.print(s);// result : abcd1

       我們明明就是改變了String型的變數s的,為什麼說是沒有改變呢? 其實這是一種欺騙,JVM是這樣解析這段程式碼的:首先建立物件s,賦予一個abcd,然後再建立一個新的物件s用來    執行第二行程式碼,也就是說我們之前物件s並沒有變化,所以我們說String型別是不可改變的物件了,由於這種機制,每當用String操作字串時,實際上是在不斷的建立新的物件,而原來的物件就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多底。

     而StringBuffer與StringBuilder就不一樣了,他們是字串變數,是可改變的物件,每當我們用它們對字串做操作時,實際上是在一個物件上操作的,這樣就不會像String一樣建立一些而外的物件進行操作了,當然速度就快了。

  3.一個特殊的例子:

1 String str = “This is only a” + “ simple” + “ test”;3 StringBuffer builder =new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

    你會很驚訝的發現,生成

str物件的速度簡直太快了,而這個時候StringBuffer居然速度上根本一點都不佔優勢。其實這是JVM的一個把戲,實際上:

    String str = “This is only a” + “ simple” + “test”;

    其實就是:

    String str = “This is only a simple test”;

    所以不需要太多的時間了。但大家這裡要注意的是,如果你的字串是來自另外的String物件的話,速度就沒那麼快了,譬如:

    String str2 = “This is only a”;

    String str3 = “ simple”;

    String str4 = “ test”;

    String str1 = str2 +str3 + str4;

    這時候JVM會規規矩矩的按照原來的方式去做。

  4.StringBuilder與 StringBuffer

    StringBuilder:執行緒非安全的

    StringBuffer:執行緒安全的

    當我們在字串緩衝去被多個執行緒使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單執行緒下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。

           對於三者使用的總結: 1.如果要操作少量的資料用 = String

                        2.單執行緒操作字串緩衝區 下操作大量資料 = StringBuilder

                        3.多執行緒操作字串緩衝區 下操作大量資料 = StringBuffer

 轉自

   http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html

自己收藏    侵刪