浅谈StringBuffer的扩充

StringBuffer的初始

我们都知道StringBuffer的构造函数有两种方式:一种带参数,一种不带参数,那么这两种对于函数:

public class demo3 {
	public static void main(String[] args) {
		StringBuffer sb=new StringBuffer();
		StringBuffer sb1=new StringBuffer(10);
		StringBuffer sb2=new StringBuffer("qwe");
		System.out.println(sb.capacity());
		System.out.println(sb1.capacity());
		System.out.println(sb2.capacity());
		System.out.println(sb.length());
		System.out.println(sb1.length());
		System.out.println(sb2.length());
	}
}

以下分别是上面函数的输出:
16
10
19
0
0
3

那么,这里给出这个的解释,StringBuffer在无参数构造函数的时候,会默认初始容量16字符,然后有参数的时候,就分两种情况:第一种是数字,如果是数字,那么初始容量也就是这个数字,否则就是16+字符的长度

然后length()函数就很好理解了,和String的length()是一个意思,都是求字符串的长度。

好了,接下来说一下StringBuffer的扩容问题

一样的,直接用代码说明问题

public class demo3 {
	public static void main(String[] args) {
		StringBuffer sb=new StringBuffer();
		System.out.println(sb.capacity());
		sb.append("1234567890");
		System.out.println(sb.capacity());
		sb.append("1234567");
		System.out.println(sb.capacity());
		sb.append("123456789012345678");
		System.out.println(sb.capacity());
		sb=new StringBuffer("qwe");
		System.out.println(sb.capacity());
		sb.append("123456789012345678123456789012345678901");
		System.out.println(sb.capacity());	
	}
}

以上代码的输出是:
16
16
34
70
19
42

相信大家很多不明白这个扩充的原理,我这里也不给你们截图底层实现了
1.第一个16输出都明白吧,是默认初始化容量
2.第二个还是输出16,是因为,只要后面加入的字符没有超过16,就默认一直是16
3.第三个输出是34,这里就需要注意了,因为第第一加入和第二次加入,已经加入了17个字符了,已经大于16了,所以就胡自动扩充,扩充规则是:2现在容量+2
4.然后,这一次加入就大于34了,所以继续扩充,就是2
34+2=70
5.这里需要注意了,因为我这里是新new了一个对象,引用改变了,所以内容也就跟着改变了,第一次初始容量就是16+字符长度,因为默认不会占用那16位
6.这里因为一次扩充不够了,所以直接扩充到需要的内内存大小

总结:
1.StringBuffer默认初始容量是16
2.扩充规则是:2*现在容量+2,如果一次扩充不够,就直接扩充到内存需要大小

猜你喜欢

转载自blog.csdn.net/qq_37871033/article/details/85312655