1.为什么初始化就把数组的大小设为16,而如果使用有参构造函数也是要传入的字符串长度+16?
答:因为使用StringBuffer或者StringBuilder都会频繁的使用append,假设value数组使用固定长度,那么每一次append或者remove都需要创建新的数组进行扩充,消耗性能,ArrayList也是这样设计的。这也是为什么额外用count变量来表示length。
2.如何对数组进行扩充的?
答:每次append的时候都会去判断当前count+newStr.length是否大于value.length,如果大于表示需要扩充,再判断是否大于value.length << 1 + 2,如果还是大扩充到count+newStr.length否则扩充到value.length << 1 +2
3.为什么要有toStringCache这个变量?
答:toStringCache是专门为toString()方法使用的,所有对字符串插入、删除、翻转、替换等修改value数组的操作都会将这个cache设为空,而toString方法会判断cache是否为空,不为空从value数组copy一个新的数组,如果存在就直接用它构建String对象
4.为什么要有AbstractStringBuilder这个类?
答:是一个抽象类,作为Stringbuffer和Stringbuilder的父类,定义并实现了它们共同拥有的很多方法,比如append等,还有成员变量value数组和count等
5.既然StringBuffer和StrngBuilder都继承了它,为什么还要重写一遍append之类的方法?
答:因为大部分方法都需要返回一个对象,如果不重写,那么每次在使用的时候都必须做一次向下转型。