2014-03-06 93 views
0

我知道這個問題已經在許多年前的許多網站上被回答了很多次。:P 我仍然有一些疑問,所以想到發佈這個。 基本的區別在於,String是不可變的,每次我們對String執行任何操作時,都會創建一個新的String對象。在java中的字符串和StringBuffer之間的區別

例如: -

String str = "some"; str = str + " text"

在上述情況下,2個新的字符串獲得創建而不是修改可以通過使用的StringBuffer避免現有STR。

例如: - StringBuffer str = new StringBuffer(); str.append("try"); str.append("this");

我的問題在這裏,追加方法我們再次傳遞一個字符串。在上面的情況下,是否爲String池中的「try」和「this」創建了新的String對象。

回答

1

是的,爲"try""this"創建了新的String對象。這裏的好處是StringBuffer在內部將字符串存儲爲一個動態調整大小的數組。

它更明顯有益的,如果我們來連接兩個以上的字符串:因爲你需要的中間值

"try" + "this" + "test" 

這可能會創建5個String對象。 (文字的技術級聯是在編譯時進行的,所以這只是一個概念性的例子。)如果編譯器不是文字,那麼也可以使用StringBuilder來重構上面的代碼片段。

StringBuilderStringBuffer的更新版本和非同步版本。一般來說,您應該更喜歡StringBuilder。這兩個類別的區別在"StringBuilder and StringBuffer in Java"中。

+0

從答案貼http://stackoverflow.com/questions/47605/string-concatenation-concat-vs-operator它看起來像 「+」 操作符後盾StringBuilder的。因此,最初的問題可能對舊版本有效。 – user3386493

0

主要區別(除了「StringBuffer」是可變的,「String」是不可變的)是性能。 我找到了一個很好的解釋here

但是我也發現StringBuilder優於StringBuffer,因爲StringBuffer是同步的而StringBuilder不是。

0

對於一些字符串,我們無法真正看到任何區別。

所以我認爲一個例子可以使用+

試試這個,看看告訴你爲什麼你應該(根據您的需要或StringBuilder的,)用StringBuffer代替字符串連接爲自己

public class UseSB { 
    static int x = 100000; 
    public static void main(String[] args) { 
     long i1 = System.currentTimeMillis(); 
     main1(); 
     long i2 = System.currentTimeMillis(); 
     main2(); 
     long i3 = System.currentTimeMillis(); 
     System.out.println(i2-i1); 
     System.out.println(i3-i2); 
    } 

    public static void main1() { 
     String s = "x"; 
     for(int i=0;i<x;i++){ 
      s = s + Integer.toString(i); 
     } 
     System.out.println(s.length()); 
    } 

    public static void main2() { 
     StringBuffer s = new StringBuffer("x"); 
     for(int i=0;i<x;i++){ 
      s.append(Integer.toString(i)); 
     } 
     System.out.println(s.toString().length()); 
    } 

} 
0
  • 字符串: 字符串是immutable(一旦創建無法更改)對象。創建爲字符串的對象存儲在常量字符串池中。 Java中的每個不可變對象都是線程安全的,這意味着String也是線程安全的。一個字符串不能被兩個線程同時使用。曾經分配過的字符串不能更改。

  • 的StringBuffer: StringBuffer的是mutable。這意味着可以改變對象的值。通過StringBuffer創建的對象存儲在堆中。 StringBuffer與StringBuilder具有相同的方法,但StringBuffer中的每個方法都是同步的,即StringBuffer是線程安全的。

    由於這樣做,它不允許兩個線程同時訪問相同的方法。每種方法一次只能由一個線程訪問。

    但是線程安全也有缺點,因爲由於線程安全屬性而導致StringBuffer的性能下降。因此,在調用每個類的相同方法時,StringBuilder比StringBuffer快。

  • 的StringBuilder: StringBuilder的是相同的StringBuffer,即它存儲在堆中的對象和它也可以被修改。 StringBuffer和StringBuilder的主要區別在於StringBuilder也不是線程安全的。 StringBuilder速度很快,因爲它不是線程安全的。

來源:http://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html

相關問題