String、StringBuffer、StringBuidler 知識整理
阿新 • • 發佈:2017-11-18
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()方法裏,會調用父類AbstractStringBuilder的append()的方法。
父類append方法如下 代碼2
1 // Documentation in subclasses because of synchro difference 2 @Override3 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 知識整理