StringBuffer扩容
之前学过c++向量Vector自动扩容,就是初始容量2倍扩容。
StringBuffer的扩容看了好多,感觉自己还是有点模糊,今天就在IDEA中亲自试了试,现在终于好像明白了。
现在只是说的容量。长度为实际容器中元素的个数,这里先不说。
一、空参构造StringBuffer()
默认容量为16,长度当然为0(没有添加任何元素)
StringBuffer stringBuffer = new StringBuffer();
System.out.println("容量为:"+stringBuffer.capacity());//16,空参构造,默认容量为16。
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1.append("12345");//5<16,容量为16。
System.out.println("容量为:"+stringBuffer1.capacity());
StringBuffer stringBuffer2 = new StringBuffer();
stringBuffer2.append("123456789012345678901234567");//17>16,17<16*2+2,所以容量为16*2+2=34
System.out.println("容量为:"+stringBuffer2.capacity());
StringBuffer stringBuffer3 = new StringBuffer();
stringBuffer3.append("12345678901234567890123456789012345");//35>34,所以容量与长度相等。为35
System.out.println("容量为:"+stringBuffer3.capacity());
现在我向里面添加元素,如果添加的元素个数小于等于16,则容量依旧为16.
若现在向里面添加的元素个数大于16,小于等于16*2+2即34,则容量为34.
若向里面添加的元素个数大于34,则容量就是实际的长度,即实际长度和容量相等。
二、有参构造 StringBuffer(“12345”)
初始里面先存几个字符。容量为,初始向里面存的字符的个数n(不管n是否大于16)+16.
StringBuffer stringBuffer1 = new StringBuffer("12345");
//16+5,则容量为传入的String的长度+16=21
System.out.println("容量为:"+stringBuffer1.capacity());
StringBuffer stringBuffer1 = new StringBuffer("12345");//5+16=21
System.out.println("容量为:"+stringBuffer1.capacity());
StringBuffer stringBuffer2 = new StringBuffer("12345678901234567");//容量为17+16=33
System.out.println("容量为:"+stringBuffer2.capacity());
StringBuffer stringBuffer4 = new StringBuffer("12345678901234567");//初始容量17+16=33
stringBuffer4.append("12345678901234567");//添加的元素17+初始17个=34个>33个,则扩容为33*2+2=68.
System.out.println("容量为:"+stringBuffer4.capacity());
StringBuffer stringBuffer3 = new StringBuffer("12345");//初始容量为5+16=21.
stringBuffer3.append("1234567890123456789012345678901234567890");//5+40=45>((5+16)*2+2),所以容量为实际长度45
System.out.println("容量为:"+stringBuffer3.capacity());
若初始向里面存的个数为n,现在又要调用append方法再向里面添加元素,假设添加的字符个数为m;
若m+n<=n+16(此时的容量),则容量为n+16.
若m+n>n+16(此时的容量),并且m+n<=(n+16)2+2, 则容量扩容为当前容量2+2.即为(n+16)*2+2.
若m+n>(n+16)*2+2,则容量为实际长度,即为m+n.
三、有参构造StringBuffer(10)
设置初始容量为10.
StringBuffer stringBuffer2 = new StringBuffer(10);//设置初始容量为10.
System.out.println("容量为:"+stringBuffer2.capacity());
StringBuffer stringBuffer3 = new StringBuffer(10);
stringBuffer3.append("12345678901");//添加11个元素,容量为10*2+2=22
System.out.println("容量为:"+stringBuffer3.capacity());
StringBuffer stringBuffer4 = new StringBuffer(10);
stringBuffer4.append("12345678901234567890123");//添加23个元素,容量为实际容量23
System.out.println("容量为:"+stringBuffer4.capacity());
-----------------------------------------------------------------------------------------------------------------------------
谢谢。