各种可能性的StringBuffer扩容详解

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());

-----------------------------------------------------------------------------------------------------------------------------
谢谢。

猜你喜欢

转载自blog.csdn.net/qq_43371004/article/details/88668442