1类签名与注释
public final class StringBuilderextends AbstractStringBuilderimplements java.io.Serializable, CharSequence
一个可变的字符序列。 此类提供与StringBuffer相同的API,但不保证同步。在单线程中应该优先使用StringBuilder,因为它不需要同步,在大多数实现中将更快。
StringBuilder的主要实现是append与insert方法,他们是重载的,以便接受任何类型的数据。append方法始终在末尾添加字符,而insert方法在指定位置添加。
每个StringBuilder都有一个容量,只要StringBuilder中包含的字符序列的长度不超过容量,则不需要分配新的内部缓冲区。 如果内部缓冲区溢出,则会自动变大。
2基本属性
StringBuilder是通过char数组实现的,字符数组声明在其父类AbstractStringBuilder中,详情如下
//存储字符的数组
char[] value;//当前数组中已有字符的计数
int count;
注意区别count和value.length,前者是已有字符的计数,后者是StringBuilder的容量。
StringBuilder的默认初始化容量是16。
3 常用方法
(1)append方法
append方法实在StringBuilder的末尾添加字符。
StringBuilder的append方法是重载的,以便接受任何类型的数据。下面是append String的方法
//append String
public StringBuilder append(String str) {super.append(str);return this;}
// 父类AbstractStringBuilder中具体实现
public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;}
append String时,首先会检查是否需要扩容(ensureCapacityInternal),然后调用String的getChars方法,将str的字符数组追加到value的后面,最后将当前的字符计数count加上str的长度。ensureCapacityInternal方法如下(AbstractStringBuilder中实现)
private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) {value &#61; Arrays.copyOf(value,newCapacity(minimumCapacity)); }}private int newCapacity(int minCapacity) {// overflow-conscious codeint newCapacity &#61; (value.length <<1) &#43; 2;if (newCapacity - minCapacity <0) {newCapacity &#61; minCapacity;}return (newCapacity <&#61; 0 || MAX_ARRAY_SIZE - newCapacity <0)? hugeCapacity(minCapacity): newCapacity;}private int hugeCapacity(int minCapacity) {if (Integer.MAX_VALUE - minCapacity <0) { // overflowthrow new OutOfMemoryError();}return (minCapacity > MAX_ARRAY_SIZE)? minCapacity : MAX_ARRAY_SIZE;}
ensureCapacityInternal首先检查是否需要扩容&#xff0c;只有当count&#43;str.length&#xff08;&#xff09;的长度大于自身容量的情况下才需要扩容。
若扩容&#xff0c;则newCapacity方法决定扩容多少&#xff0c;最小扩容的新容量&#61;旧容量*2&#43;2&#xff0c;当这个值还小于count&#43;str.length&#xff08;&#xff09;时&#xff0c;新容量&#61;count&#43;str.length&#xff08;&#xff09;
其他重载的append方法原理差不多&#xff0c;这里就不多说了。
&#xff08;2&#xff09;insert方法
insert方法可以在StringBuilder指定位置添加字符&#xff08;串&#xff09;
StringBuilder的insert方法是重载的&#xff0c;以便接受任何类型的数据。下面是在指定开始位置insert String的实现
//指定开始位置insert String
public StringBuilder insert(int offset, String str) {super.insert(offset, str);return this;}//父类AbstractStringBuilder中具体实现
public AbstractStringBuilder insert(int offset, String str) {if ((offset <0) || (offset > length()))throw new StringIndexOutOfBoundsException(offset);if (str &#61;&#61; null)str &#61; "null";int len &#61; str.length();ensureCapacityInternal(count &#43; len);System.arraycopy(value, offset, value, offset &#43; len, count - offset);str.getChars(value, offset);count &#43;&#61; len;return this;}
底层还是调用System.arraycopy通过数组复制实现的。
&#xff08;3&#xff09;delete
&#xff08;4&#xff09;replace