java StringBuilder类的capacity()方法被调用后, 打印结果不是“默认容量16“ 的情况分析

在创建一个StringBuilder的空字符串对象后, 调用capacity()方法, 可以看到该对象(char[]类型) 默认容量为16,

    public static void main(String[] args) {
        //创建一个StringBuilder对象
        StringBuilder sb = new StringBuilder();
        System.out.println(sb.capacity());
    }

 运行结果

16

但如果起初创建的StringBuilder对象时所调用的不是上述默认初始化的构造方法, 而是一个添加了非空字符串内容的, 如下

        StringBuilder sb = new StringBuilder("abc");
        System.out.println(sb.capacity());

运行结果会显示

19

为了验证"StringBuilder对象在创建时有无字符串参数对其初始容量是有影响的"这一猜想, 查看StringBuilder类源码, 可以发现(如下代码)

 ...
AbstractStringBuilder(String str) {
    int length = str.length();
    int capacity = (length < Integer.MAX_VALUE - 16)
            ? length + 16 : Integer.MAX_VALUE;
    final byte initCoder = str.coder();
    coder = initCoder;
    value = (initCoder == LATIN1)
            ? new byte[capacity] : StringUTF16.newBytesFor(capacity);
    append(str);
} ...

 这表明StringBuilder带参构造所引起的初始capacity的增加是由于继承了它的父类AbstractStringBuilder的特性, 高亮代码表明 "如果对象创建时的字符串参数长度为3, 则capacity = 16(默认容量)+ 3; 如果长度为length, 则capacity = 16 + length; 依此类推"

因此, 上述出现运行结果为19的情况就可以理解了, 19 = 16 + 3, 这是由于capacity()这一重载方法最初设计导致的容量增加

你可能感兴趣的:(java学习笔记,java,开发语言)