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()
答案 0 :(得分:8)
StringBuffer
的{{1}}的逻辑已在Javadoc中说明:
void java.lang.AbstractStringBuilder.ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。如果当前容量小于参数,那么将分配具有更大容量的新内部数组。新容量中的较大者:
•minimumCapacity参数。
•容量的两倍加2。
在第二个代码段中,44(这是所需的最小容量,因为第二个ensureCapacity
之后的append
中将有44个字符)大于旧容量的两倍,加上2(是34)。因此,新容量为44。