Java 字符串缓冲区容量()

Java 字符串缓冲区容量(),java,stringbuffer,capacity,Java,Stringbuffer,Capacity,o/p为 public static void main(String args[]){ StringBuilder sb=new StringBuilder(); System.out.println(sb.capacity()); sb.append("abcabcabcabcabcabcab"); System.out.println(sb.length()); System.out.println(sb.capacity()); System

o/p为

public static void main(String args[]){
  StringBuilder sb=new StringBuilder();

    System.out.println(sb.capacity());
    sb.append("abcabcabcabcabcabcab");
    System.out.println(sb.length());
    System.out.println(sb.capacity());
    System.out.println("-----");
    sb.append("abcabcabcabcabcabcab");
    System.out.println(sb.length());
    System.out.println(sb.capacity());
    System.out.println("-----");
    sb.trimToSize();
    System.out.println(sb.capacity());
    System.out.println(sb.length());
}

我的问题是,在第二行中,容量应该是36(20+16)。为什么它显示为34。

查看Javadoc,我不认为
StringBuilder
指定了它的具体增长方式,但最有可能发生的是,一旦它必须增长,它会调用以下文档:

新容量为以下两项中的较大者:

  • 最小容量参数
  • 旧容量的两倍,加上2
所以你从最初的16到

  • 新长度(20)
  • 或两倍于当前容量(16)加上2
结果是34岁


但同样,这可能是特定于实现的,而不是您应该依赖(或需要关心)的内容。

您的标题和标记显示StringBuffer。你的代码是StringBuilder。哪一个是相关的:(如果你指的是StringBuffer)但在另一行添加新文本后,它的长度变为40,现在为什么显示容量为70?@RuchiGupta:Old capacity=34,new capacity=(34*2)+2=70。哪里是混乱!
16
20
34
-----
40
70
-----
40
40