StringBulider类的扩展机制

StringBuilder的扩容机制详解

StringBuilder是一个可变的字符序列,是字符串缓冲的一个类,和String一样是用来操作字符串的,不同的时候StringBuilder在操作字符串的时候效率比String高.主要体现在对字符串进行拼接的时候.所以我们在对字符串进行拼接的时候首选使用StringBuilder类.

今天主要给大家说一说有关StringBuilder类扩容的问题.

首先,我们从源码中可以看出,StringBuilder的底层使用的是byte数组来存储的(这个可以去找StringBuilder的父类AbstractStringBuilder类,该类中定义了byte[]类型的变量,用来接收StringBuilder添加的数据).该数组是在创建StringBuilder对象的时候进行初始化的,而且初始化的时候只能来确定数组的长度.

我们应该知道,数组一旦被创建完成,其长度是不可变的.那么该byte数组就有可能被内容填满,当填满之后再向里面添加内容怎么办呢?这就要考虑到如何让byte[]数组随着,内容的添加而不断的”改变其长度”.

在首次创建这个byte[]数组的时候,也不肯能将数组的长度定义的太大(考虑到资源浪费的问题):那到底有多长呢?有一个方法可以得到StringBuilder类的初始容量值:


int capacity()
​ 返回当前容量。


该方法返回的是StringBuilder的当前容量值.

![](media/image1.png){width="5.759722222222222in" height="1.525in"}

有上图可知,当我们创建一个空参的StringBuilder对象,返回的可容纳容量值是16个字符.扒开StringBuilder类的空参构造的方法可以发现:

![](media/image2.png){width="5.7652777777777775in" height="0.8458333333333333in"}

空参构造中,自己指定的一个16的长度.

当然,如果内容超过了16个字符,会怎么办呢?在内部中有一个公式:

新长度 = 旧长度 * 2 + 2; //这就是StringBuilder底层数组的扩容方式.看源码如下:

![](media/image3.png){width="5.7652777777777775in" height="2.3493055555555555in"}

注意:必须是内容超过了原有数组的长度,才会扩容.

StringBuilder类还有其他构造,只是初始化容量值不一样,扩容的机制都是相同的.

例如:

StringBuilder(int capacity) 该构造可以自定义初始容量值.扩容是在此容量值基础之后乘以2再加2.依次类推.构造源码如下:

![](media/image4.png){width="4.728472222222222in" height="0.8333333333333334in"}

StringBuilder(String str) 该构造是把str.length + 16作为初始容量值,扩容是在此容量值基础之后乘以2再加2.依次类推.构造源码如下:

![](media/image5.png){width="4.915972222222222in" height="1.0729166666666667in"}

猜你喜欢

转载自blog.csdn.net/sinat_43606156/article/details/86540365