一、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三者的区别