//StringBuilder 继承于 AbstractStringBuilder(AbstractStringBuilder 实现了 Appendable 接口, CharSequence 接口的部分方法)
public final classStringBuilderextendsAbstractStringBuilderimplementsjava.io.Serializable, CharSequence
{//无参构造器,调用了父类有参构造器,初始化字符数组容量为 16
publicStringBuilder() {super(16);
}public StringBuilder(intcapacity) {super(capacity);
}publicStringBuilder(String str) {super(str.length() + 16);
append(str);
}
@OverridepublicStringBuilder append(Object obj) {returnappend(String.valueOf(obj));/*这里我们给出 java.lang.String 类定义的 valueOf()方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}*/}
@OverridepublicStringBuilder append(String str) {super.append(str);return this;
}
}//从上面可以看出 StringBuilder 类的大部分方法都是继承自 AbstractStringBuilder,所以我们直接看 AbStractStringBuilder 类是怎么样实现这些方法的
abstract class AbstractStringBuilder implementsAppendable, CharSequence {char[] value;//底层用的是 char 数组来存储数据
int count;//字符串长度//无参构造器
AbstractStringBuilder() {
}//有参构造器,用于初始化 char 数组的容量
AbstractStringBuilder(intcapacity) {
value= new char[capacity];
}//返回字符串长度
@Overridepublic intlength() {returncount;
}//返回字符数组的容量
public intcapacity() {returnvalue.length;
}//追加方法
publicAbstractStringBuilder append(String str) {if (str == null)returnappendNull();int len =str.length();
ensureCapacityInternal(count+ len);//判断是否需要扩容
str.getChars(0, len, value, count);//底层是:System.arraycopy(str, 0, value, count, len - 0);
count +=len;return this;
}private void ensureCapacityInternal(intminimumCapacity) {//overflow-conscious code
if (minimumCapacity - value.length > 0) {
value= Arrays.copyOf(value, newCapacity(minimumCapacity));//底层是:System.arraycopy(value, 0, copy, 0, Math.min(value.length, newCapacity)); + return copy;
}
}private int newCapacity(intminCapacity) {//overflow-conscious code
int newCapacity = (value.length << 1) + 2;//新容量 = old容量 * 2 + 2
if (newCapacity - minCapacity < 0) {
newCapacity=minCapacity;
}return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0) ?hugeCapacity(minCapacity) : newCapacity;
}private int hugeCapacity(intminCapacity) {if (Integer.MAX_VALUE - minCapacity < 0) { //overflow
throw newOutOfMemoryError();
}return (minCapacity > MAX_ARRAY_SIZE) ?minCapacity : MAX_ARRAY_SIZE;
}
}