StringBuffer的扩容机制中为什么是*2+2?
StringBuffer的扩容机制中为什么是*2+2? 在我们对StringBuffer的源码进行分析的时候。我们可以看到。
StringBuffer进行append时,方法是这样的,其中的synchronized正说明了其实线程安全的。
先判断添加的字符串是不是空,若为空就执行appendNull方法,不为空的话就计算添加的字符串长度,count是当前的stringBuffer对象的长度,然后进行扩容,最后将原有的内容复制到新的stringBuffer中,并且更新stringBuffer的长度。下面我们看一如何创建新的stringBuffer 的。
传递的参数是最小容量,就是原有长度+新增长度,判断一下是否超出范围,如果超出,就先new一个容量,在复制原有字符。
private int newCapacity(int minCapacity) { // overflow-conscious code int newCapacity = (value.length << 1) + 2; if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0) ? hugeCapacity(minCapacity) : newCapacity; }
扩容的原理是左移一位(乘2)+2,左移我们可以理解,位运算比较快,那么+2是为何呢,原来是避免0左移1位还是0这样的问题,+2能够很好地避免这个问题。
此外如果*2+2还不够就把新的长度作为最小长度。
大家明白了吗。