1. 程式人生 > >StringBuffer與StringBuilder的區別

StringBuffer與StringBuilder的區別

解釋 需要 類型 初始化 builder str 長度 相對 鎖機制

目錄: 1. String 的字符串拼接

   2. StringBuffer的線程安全體現在哪裏? 效率低又體現在哪裏?

   3. Stringbuilder的線程不安全體現在哪裏?效率高又體現在哪裏?

1. String 的字符串拼接
  效率低,為什麽?因為String類型是不可變的字符串,字符串拼接需要重新分配內存。

2. StringBuffer的線程安全體現在哪裏? 效率低又體現在哪裏?
  StringBuffer是可變的字符序列,
  相對與String的字符拼接,效率要高,
  因為String每次字符串拼接,都需要分配一個新的內存空間;


  而StringBuffer不需要每次分配新的內存空間。
  StringBuffer開始初始化時,new StringBuffer()
  構造器(super(16))設定了16個字符的緩存容量,而且它時可變的字符序列。
  所以在字符串拼接時,不需要分配容量;
  只有當拼接後的字符序列大於16時,首先StringBuffer會去擴充容量,容量的長度為
拼接後字符串的長度。

有一個例子,
```
StringBuffer sb = new StringBuffer();
StringBuffer sb1 = sb.append("a");
StringBuffer sb2 = sb.append("b");
System.out.println(sb1);//ab
```
為什麽會輸出ab,不是a呢,原因是StringBuffer是可變的,共用一個緩存區。
sb1,sb2,sb都指向緩存區內的new Stringbuffer()對象,而StringBuffer是共用一個緩存區的,
所以在sb1=sb2=sb = "ab";

線程安全體現在哪裏? 要想安全,一般的做法是加把鎖,加道門,在底層代碼中使用了synchronized鎖。

現在解釋一下,為什麽加了把鎖,它的效率就低。
比如一個線程需要操作一對象時,而這個對象被另一個線程加了把鎖,那麽這個線程需要等待原先的線程先把鎖打開,再對這個對象進行操作。
所以在操作上,需要先把鎖打開,然後對這個對象進行操作,這個是需要時間的。
而非線程安全不需要加鎖,所以對這個對象操作就更快。

3. Stringbuilder的線程不安全體現在哪裏?效率高又體現在哪裏?
線程不安全體現在沒有在方法和屬性上加鎖,效率高體現在,線程對對象進行操作,不需要進行解鎖操作,
不需要等待時間。


以後還需要添加一章synchronized鎖機制的原理以及應用。

StringBuffer與StringBuilder的區別