StringBuffer 和 StringBuilder

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: 从上所看(

value.length * 2 + 2;


缓冲区长度*2+2 >传进来的容量大小,那么就将传进来的容量大小作为该StringBuffer的容量)

你可能感兴趣的:(StringBuffer 和 StringBuilder)