日期:2014-05-19  浏览次数:20879 次

StringBuilder的length方法和capacity方法问题
public class TestCapacity {

public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("Hello");
System.out.println("StringBuffer: "+sb1);
System.out.println("length: "+sb1.length());
System.out.println("capacity: "+sb1.capacity());
System.out.println("--------------------");

sb1.append("aaaaabbbbbcccccddddd");
System.out.println("StringBuffer: "+sb1);
System.out.println("length: "+sb1.length());
System.out.println("capacity: "+sb1.capacity());
System.out.println("--------------------");

StringBuilder sb2 = new StringBuilder("aaaaabbbbbcccccddddd");
sb2.append("aaaaabbbbbcccccddddd");
System.out.println("StringBuffer: "+sb2);
System.out.println("length: "+sb2.length());
System.out.println("capacity: "+sb2.capacity());

}
}

结果:
StringBuffer: Hello
length: 5
capacity: 21
--------------------
StringBuffer: Helloaaaaabbbbbcccccddddd
length: 25
capacity: 44
--------------------
StringBuffer: aaaaabbbbbcccccdddddaaaaabbbbbcccccddddd
length: 40
capacity: 74
高手们说说结果为什么会这样。

------解决方案--------------------
看看StringBulider的源码就知道了,它的底层实现就是字符数组,如果用默认的构造函数,就会构造一个长度为16的字符数组,如果构造函数里面用一个字符串,那么这个字符数组的长度就是字符串的长度+16,然后调用append方法的时候就会判断数组的长度是否足够,否则就会重新扩展,扩展的长度为当前实际使用长度+1再乘以2,这里面说的数组长度指的就是容量
length表示实际长度
capacity表示容量

这个原理跟ArrayList的实现如出一辙,LZ可以去看看源码