目录
- StringBuffer的构造方法
- StringBuffer的扩容
StringBuffer的构造方法
这是StringBuffer的类图,StringBuffer继承AbstractStringBuilder。StringBuffer中的构造方法都调用了其父类的构造方法,因此在了解StringBuffer的构造方法前有必要了解一下它们俩的成员变量。
以上是AbstractStringBuilder的三个成员变量,value用来存储字符,count代表使用的字符数;MAX_ARRAY_SIZE是最大的分配容量,即2^31-9,若想分配超过这个数字的容量将会报OutOfMemoryError的错误:请求的数组大小超过VM限制。
以上的StringBuffer的一个成员变量,toString方法将会返回它最后的值,当StringBuffer被修改时它将会被清空。
StringBuffer类可以创建可修改的字符串序列。该类有StringBuffer(),StringBuffer(int size),StringBuffer(String s),StringBuffer(CharSequence seq)构造方法。
1.StringBuffer()的初始容量可以容纳16个字符,当该对象的实体存放的字符的长度大于16时,实体容量就自动增加。StringBuffer对象可以通过length()方法获取实体中存放的字符序列长度,通过capacity()方法来获取当前实体的实际容量。
2.StringBuffer(int size)可以指定分配给该对象的实体的初始容量参数为参数size指定的字符个数。当该对象的实体存放的字符序列的长度大于size个字符时,实体的容量就自动的增加。以便存放所增加的字符。
3.StringBuffer(String s)可以指定给对象的实体的初始容量为参数字符串s的长度额外再加16个字符。当该对象的实体存放的字符序列长度大于size个字符时,实体的容量自动的增加,以便存放所增加的字符。
4.StringBuffer(CharSequence seq)当传入一个CharSequence变量时,会调用StringBuffer(int capacity)方法,初始大小为seq的长度加16,同时初始内容为seq的StringBuffer对象。
StringBuffer的扩容
扩容策略(2*n + 2):
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。
当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2旧值+2)。
如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。
扩容源码:
StringBuffer和StringBuilder类都继承了抽象类AbstractStringBuilder类;源码都调用父类来进行初始化:
StringBuffer(String s)的初始化:
扩容算法:
使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;
再进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容:
尝试将新容量扩为大小变成2倍+2 if 判断一下 容量如果不够,直接扩充到需要的容量大小。
作者:Roger_CoderLife
链接:https://blog.csdn.net/Roger_CoderLife/article/details/95179792
本文为Roger_CoderLife的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!