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()这一重载方法最初设计导致的容量增加
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值