StringBuffer 和 StringBuilder
1 相同点:
(1) StringBuffer 和 StringBuilder 都继承了AbstractStringBuilder
(2) StringBuffer和StringBuilder底层初始化容量都是16
(3) StringBuffer和StringBuilder都只是生成一个String对象
2 不同点:
(1) StringBuffer 是线程安全,StringBuilder是线程不安全的,(因为StringBuffer中的方法都是由synchronized关键字修饰的)
(2) StringBuffer中使用的是 一个char[] 数组作为缓冲区,StringBuilder中根据传值,通过值的length+初始化容量变为此时的容量大小
StringBuffer 扩容源码如下(实际是 AbstractStringBuilder扩容方法)
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
void expandCapacity(int minimumCapacity) {
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);
}
PS: 从上所看(<p>value.length * 2 + 2;</p>
缓冲区长度*2+2 >传进来的容量大小,那么就将传进来的容量大小作为该StringBuffer的容量)