java中StringBuffer的length()和capacity()方法对比
StringBuffer的length()和capacity()
StringBuffer类和String类差不多,都是字符串类,只是StringBuffer在对字符串进行修改时不会生成新的对象,所以效率相对较高,占用空间也小。
length()方法和capacity()方法都是获取StringBuffer的长度。
length()返回字符串的实际长度;
capacity()返回字符串所占容器的总大小。
举例:
可以看到:
1.StringBuffer的的初始大小为(16+初始字符串长度)即capacity=16+初始字符串长度;
2.一旦length大于capacity时,capacity便在前一次的基础上加1后倍增;
例如:
length=1;capacity=17;//初始长度 length=5;capacity=17;// length=17;capacity=17;// length=18;capacity=(capacity+1)*2=36;//第一次倍增 ............ length=37;capacity=(capacity+1)*2=74;//第二次倍增 ............
但有如下特殊情况:
StringBuffer sb3=new StringBuffer("a"); System.out.println("length="+sb3.length());//length=1 System.out.println("capacity="+sb3.capacity());//capacity=17; System.out.println("--------------------"); sb3.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); System.out.println("length="+sb3.length());//length=20; System.out.println("capacity="+sb3.capacity());//capacity=40;
当length>capacity时,capacity倍增仍达不到length的长度,这种现象称为跨阶,此时,capacity将根据length的实际大小设置长度,此后将按照直接倍增的方式增长(不将length+1)
StringBuffer类初始容量及扩容
StringBuffer类可以创建可修改的字符串序列
该类有StringBuffer(),StringBuffer(int size),StringBuffer(String s)三个改造方法。
1.StringBuffer()的初始容量可以容纳16个字符,当该对象的实体存放的字符的长度大于16时,实体容量就自动增加。StringBuffer对象可以通过length()方法获取实体中存放的字符序列长度,通过capacity()方法来获取当前实体的实际容量。
2.StringBuffer(int size)可以指定分配给该对象的实体的初始容量参数为参数size指定的字符个数。当该对象的实体存放的字符序列的长度大于size个字符时,实体的容量就自动的增加。以便存放所增加的字符。
3.StringBuffer(String s)可以指定给对象的实体的初始容量为参数字符串s的长度额外再加16个字符。当该对象的实体存放的字符序列长度大于size个字符时,实体的容量自动的增加,以便存放所增加的字符。
接下来介绍StringBuffer()怎样扩容:
首先我们需要知道StringBuffer和StringBuilder类都继承了抽象类AbstractStringBuilder类;
源码都调用父类来进行初始化:
StringBuffer(String s)的初始化:
扩容算法:
使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;
再进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容:
尝试将新容量扩为大小变成2倍+2 if 判断一下 容量如果不够,直接扩充到需要的容量大小。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。