1. 程式人生 > >String、StringBuffer、StringBuidler 知識整理

String、StringBuffer、StringBuidler 知識整理

style ofb code [] zab 就是 sequence index city

String、StringBuffer、StringBuidler、這三個家夥,大家都不陌生,肯定也都會用。三者異同大家都能說出來,但是其根本原因是什麽呢?帶著下面問題,學習一下。

第一、String與後兩者不同,為什麽String對象不可變,後兩者對象可變呢?

第二、線程安全方面,為什麽StringBuffer比StringBuidler安全呢?

1.我們首先看String的源碼(截取一小部分):

 1 public final class String
 2     implements java.io.Serializable, Comparable<String>, CharSequence {
3 /** The value is used for character storage. */
我標紅的地方就是關鍵,String中的字符串是通過數組char來存儲的,而它的修飾符是final,這就解釋了為什麽String對象不可變的原因。
4 private final char value[]; 5 6 /** Cache the hash code for the string */ 7 private int hash; // Default to 0

2.看看StringBuilder源碼

它繼承了AbstractStringBuilder

這個類。

1     @Override
2     public StringBuilder append(CharSequence s) {
3         super.append(s);
4         return this;
5     }

在append()方法裏,會調用父類AbstractStringBuilderappend()的方法。

 父類append方法如下                 代碼2

1
// Documentation in subclasses because of synchro difference 2 @Override
3 public AbstractStringBuilder append(CharSequence s) { 4 if (s == null) 5 return appendNull(); 6 if (s instanceof String) 7 return this.append((String)s); 8 if (s instanceof AbstractStringBuilder) 9 return this.append((AbstractStringBuilder)s); 10 11 return this.append(s, 0, s.length()); 12 }
 1     @Override                  代碼3(標識用)
 2     public AbstractStringBuilder append(CharSequence s, int start, int end) {
 3         if (s == null)
 4             s = "null";
 5         if ((start < 0) || (start > end) || (end > s.length()))
 6             throw new IndexOutOfBoundsException(
 7                 "start " + start + ", end " + end + ", s.length() "
 8                 + s.length());
 9         int len = end - start;
10         ensureCapacityInternal(count + len);
11         for (int i = start, j = count; i < end; i++, j++)
12             value[j] = s.charAt(i);
13         count += len;
14         return this;
15     }

上述代碼3中的12行value在源碼中定義是 char[] value; 沒有final關鍵字。

3.說說StringBuffer

它也是繼承了AbstractStringBuilder這個類,

1     @Override
2     public synchronized StringBuffer append(CharSequence s) {
3         toStringCache = null;
4         super.append(s);
5         return this;
6     }

在append方法中,加入了synchronized關鍵字,所以在多想城稱重,StringBuffer是安全的,但是安全的代價就是影響了一些速度,因此速度肯定慢於StringBuilder。這裏也就解釋文章開頭提出的第二個問題。

簡單的整理記錄一下。不對的地方歡迎指正。

String、StringBuffer、StringBuidler 知識整理