浅谈StringBuffer构造方法及扩容

目录

  1. StringBuffer的构造方法
  2. 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的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章