StringBuilder
是可變字符串類型,它被人所熟知的功能就是能夠很方便的對字符串進行拼接、構造:java
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
方法是 final
的,繼承了 AbstractStringBuilder
抽象類:數組
abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; int count; ... }
能夠看到它實現了 Appendable
接口,而 Appendable
接口就是提供了能夠被添加char序列和值的功能,它實現了三種 append
方法:安全
Appendable append(CharSequence csq) throws IOException; Appendable append(CharSequence csq, int start, int end) throws IOException; Appendable append(char c) throws IOException;
其中 CharSequence
是 char
值的可讀序列,此接口對許多不一樣種類的 char
序列提供統一的只讀訪問, String
StringBuilder
StringBuffer
都實現了這個接口:app
int length(); char charAt(int index); CharSequence subSequence(int start, int end);
在 AbstractStringBuilder
抽象類中,提供了一系列的 append
和 insert
方法的實現,下面是其中一種實現:ui
public AbstractStringBuilder append(String str) { if (str == null) str = "null"; //若是爲空,則添加null字符串 int len = str.length(); ensureCapacityInternal(count + len);//保證容量 //複製str字符串到char數組value,從count位開始添加 str.getChars(0, len, value, count); count += len; return this; }
private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) expandCapacity(minimumCapacity); }
若是傳遞的最小容量大於現有容量,則必須進行擴容:this
void expandCapacity(int minimumCapacity) { //新容量爲old*2+2 int newCapacity = value.length * 2 + 2; if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity; if (newCapacity < 0) { if (minimumCapacity < 0) // overflow throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE; } value = Arrays.copyOf(value, newCapacity); }
注意: AbstractStringBuilder
中的方法實現都沒有進行同步insert
方法:線程
public AbstractStringBuilder insert(int offset, String str) { if ((offset < 0) || (offset > length())) throw new StringIndexOutOfBoundsException(offset); if (str == null) str = "null"; int len = str.length(); ensureCapacityInternal(count + len); System.arraycopy(value, offset, value, offset + len, count - offset); str.getChars(value, offset); count += len; return this; }
StringBuffe
r類的出現實際上比 StringBuilder
要早,當初提供 StringBuilder
類只是爲了提供一個單個線程使用的 StringBuffer
等價類。若是觀察 StringBuffer
的源代碼,能夠發現它的方法和 StringBuilder
相同,只不過都加上了 synchronized
,好比:code
public synchronized StringBuffer append(String str) { super.append(str); return this; }
如今咱們已經明確的記住了 StringBuffer
是線程安全的,而 StringBuilder
不是繼承
在效率上, StringBuffer
由於對方法作了同步,因此通常是低於 StringBuilder
的接口
兩者都是可變的,由於兩者都繼承 AbstractStringBuilder
,它的 char[] value
沒有使用 final
修飾,只是普通數組。 String
的 value
是 final
的,即不可變的
都有實現 CharSequence
接口