StringBuffer.append()的未知行为

时间:2019-07-15 06:16:05

标签: java stringbuffer

StringBuffer.append()的怪异行为: javatpoint声明:

  

如果字符数从当前容量增加,它将>(oldcapacity * 2)+2增加容量。

可以通过以下代码进行演示:

class test {
        public static void main(String[] args) {
                StringBuffer sb = new StringBuffer();

                sb.append("abcdef"); // 16;
                System.out.println(sb.capacity());

                sb.append("1234561711"); // 34
                System.out.println(sb.capacity()); // 34
        }
}

但是,它在以下代码中显示了奇怪的行为:

class test {
        public static void main(String[] args) {
                StringBuffer sb = new StringBuffer();

                sb.append("abcdef"); // 16;
                System.out.println(sb.capacity());

                sb.append("12345617111111111111111111111111111111"); // 44 total 44 character in sb, so capacity should be 70 as it goes from 16, 34, 70, 142 etc.
                System.out.println(sb.capacity()); // 34
        }
}

如果我们在上面的字符中使用两个追加,容量将为70 ! 因此,我认为只有一个限制可以打破append()

1 个答案:

答案 0 :(得分:8)

StringBuffer的{​​{1}}的逻辑已在Javadoc中说明:

  

void java.lang.AbstractStringBuilder.ensureCapacity(int minimumCapacity)

     

确保容量至少等于指定的最小值。如果当前容量小于参数,那么将分配具有更大容量的新内部数组。新容量中的较大者:

     

•minimumCapacity参数。

     

•容量的两倍加2。

在第二个代码段中,44(这是所需的最小容量,因为第二个ensureCapacity之后的append中将有44个字符)大于旧容量的两倍,加上2(是34)。因此,新容量为44。