jdk1.8源码(四) - StringBuilder类 和 StringBuffer类

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 ,两个比较取小的那个。

 

posted @ 2019-01-04 17:13  楠木(鱼摆摆)  阅读(384)  评论(0编辑  收藏  举报