admin管理员组

文章数量:1611516

从API查到capacity的作用是查看StringBuffer的容器容量是多少,刚开始纳闷这个跟length的区别在哪?试验了几次感觉有点不解。所以直接跟进源码分析。

直接通过new StringBuffer(String str);时,capacity是str.length+16,从源码可知:

如果直接是new StringBuffer(),则capacity为16,见下图:

如果小于16则默认容器的大小为16。如果大于16则会调用expandCapacity 函数进行容量的扩展。

由源码可以看到扩展的规则是把旧的容量(value的长度)*2+2,然后与现有的比较,如果小于则把现有的容量当做新的,如果大于则用新得到的容量。

所以第一次append时,小于16则不需扩展,如果大于16则会直接扩展到34(16*2+2),比较得到大于append后的长度的话则用34,如果不 是则用append后的长度。

此时capacity的大小等于append后的长度,如果在append的话,若不超过70(34*2+2)的话,此时则capacity为70,如果超过70则继续用第二次append后的总长度。

实验源码:

1 public static voidmain(String[] args) {2

3 //StringBuffer的初始容量为16个字节长度。

4

5 StringBuffer s = newStringBuffer();6

7 s.append("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");8

9 //超过16不超过34则用34,超过34则用append后的长度

10

11 s.append("a");12

13 //若上面append刚好超过34,为35,则capacity为35,但是若append一个字节,则为35*2+2=72

14

15 sop(s);16

17 sop(s.capacity()); //字符串容器的容量

18

19 sop(s.length()); //字符串的实际长度

20

21 }

本文标签: JavaCapacityStringBuffer