StringBuiler和StringBuffer的定义
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
通过代码,我们可以看到他们都是继承了AbstractStringBuilder类 ,他们之前的区别就在于StringBuffer在重写父类的方法时,都加了synchronized关键字。然后都是直接调用父类的方法。所以接下来我们介绍AbstractStringBuilder类。注:当创建StringBuffer和StringBuilder时,默认长度是 16
AbstractStringBuilder 的属性
char[] value;//数组用的长度int count;private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
可以看到,本质上还是char数组。
AbstractStringBuilder.append(String str)方法
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; }private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); }}private int newCapacity(int minCapacity) { // overflow-conscious code int newCapacity = (value.length << 1) + 2; //左移 if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0) ? hugeCapacity(minCapacity) : newCapacity; }
主要说下。当添加一个字符串时,会事先判断append后的长度是否大于的当前char数组声明的长度,如果大于,则动态扩容,扩容后的长度是 根据需要的长度(minCapacity) 或者 先原本长度的 2倍 +2 ,两个比较取小的那个。