StringBuffer源码分析构造方法和扩容(jdk1.8)

一、StringBuffer的构造方法

这是StringBuffer的类图,StringBuffer继承AbstractStringBuilder。StringBuffer中的构造方法都调用了其父类的构造方法,因此在了解StringBuffer的构造方法前有必要了解一下它们俩的成员变量。

以上是AbstractStringBuilder的三个成员变量,value用来存储字符,count代表使用的字符数;MAX_ARRAY_SIZE是最大的分配容量,即2^31-9,若想分配超过这个数字的容量将会报OutOfMemoryError的错误:请求的数组大小超过VM限制

以上的StringBuffer的一个成员变量,toString方法将会返回它最后的值,当StringBuffer被修改时它将会被清空

(1)StringBuffer()

这是StringBuffer的源码截图,可以发现StringBuffer的初始容量为16,并且调用了父类的构造方法,创建了大小为16的char数组

 

(2)StringBuffer(int) 

当传入一个整型的数值capacity时,StringBuffer会以capacity为初始容量进行创建,并调用父类构造方法,创建capacity大小的char数组

(3)StringBuffer(String)

当向StringBuffer构造方法传入一个字符串str时,会调用父类方法,构造一个初始大小为str的长度加16的cha数组,

然后调用StringBuffer的append方法

该append方法中,置toStringCache为空,并调用父类append方法

(4)StringBuffer(CharSequence)

当传入一个CharSequence变量时,会调用StringBuffer(int capacity)方法,初始大小为seq的长度加16,同时初始内容为seq的StringBuffer对象

二、StringBuffer的扩容

以StringBuffer append(String str)为例

会先将toStringCache清空,然后调用父类append方法

如果str为空,调用appendNull()方法,在旧value数组后面追加“null”四个字符。

否则调用ensureCapacityInternal方法,这是一个判断是否需要扩容的方法

如果传入的minimunCapacity比原来value的长度大,就会调用newCapacity()

先将新容量扩大到value的长度乘以2加2,如果不够则直接扩充到所需的容量大小,够则还要进行判断。如果比Integer的最大值还要大会抛异常;否则,如果比MAX_ARRAY_SIZE大,则创建新容量为minCapacity;如果比MAX_ARRAY_SIZE小,则新容量为MAX_ARRAY_SIZE

 

最后,分享两篇文章:

探秘Java中的String、StringBuilder以及StringBuffer

Java中的String,StringBuilder,StringBuffer三者的区别

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值