admin管理员组

文章数量:1612099

        StringBuffer s1=new StringBuffer(10);
        s1.append("1234");
        s1.length();//4
        s1.capacity();//10

计算 StringBuffer 的length 返回当前长度 ,

查看源码发现length 取值count:

    public synchronized int length() {
        return count;
    }

而count 值是在append方法时赋值的,

    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }
    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len; // count =  str.length() ="1234".length()
        return this;
    }

计算 StringBuffer 的capacity 返回当前容量,

查看源码发现length 取值value.length:

    public synchronized int capacity() {
        return value.length;
    }

在StringBuffer 初始化时,value = new char[capacity];
在这里是value = new char[10]; value.length = 10;

    public StringBuffer(int capacity) {
        super(capacity);
    }
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

在执行append 时,执行 ensureCapacityInternal(count + len);方法

    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }

这里
ensureCapacityInternal(count + len)
count 初始值是0;len= str.length() =4 ;

    private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        if (minimumCapacity - value.length > 0)
            expandCapacity(minimumCapacity);
    }

当 minimumCapacity - value.length 即是4-10<0 ;
不执行执行 expandCapacity(minimumCapacity);
value.length =10;

    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);
    }

通过上述源码,总结来说,对于capacity
StringBuffer s = new StringBuffer(x); x为初始化容量长度
s.append(“Y”); "Y"表示长度为y的字符串
length始终返回当前长度即y;
对于s.capacity():
1.当y<x时,值为x
以下情况,容器容量需要扩展
2.当x<y<2x+2时,值为 2x+2
3.当y>2*x+2时,值为y

本文标签: 方法StringBufferlengthCapacity