为什么在StringBuilder中扩容时会+2
个人认为主要是有两个原因
1.避免存在value.length为零的情况,此时扩容后newCapacity依然为0
private int newCapacity(int minCapacity) {
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
2.在极端情况下也能确保newCapacity上溢后newCapacity - minCapacity < 0为false
int minCapacity = Integer.MAX_VALUE;
//newCapacity在扩容后最大的值为偶数Integer.MAX_VALUE - 1
int newCapacity = Integer.MAX_VALUE - 1 + 2;
//在最极端的情况下,此时小于号右边结果为1,保证能够检测到newCapacity上溢
System.out.println(newCapacity - minCapacity < 0);
//输出结果为false