Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upArraylist源码分析,扩容大小既不是1.5倍,也不是1.5倍加1,这个要看原数组大小的奇偶来判定 #428
Comments
|
能详细说一下嘛 |
|
你去看一下源码,源码扩容的具体代码。
|
|
最好自己提个pr,版主可能没时间改-- 移位我把源码搞过来,源码里说明了 有符号右移相当于除以2就懂了,10+10/2 = 15, 33+33/2=49。如果是奇数的话会丢掉小数. /**
* ArrayList扩容的核心方法。
*/
private void grow(int minCapacity) {
//elementData为保存ArrayList数据的数组
///elementData.length求数组长度elementData.size是求数组中的元素个数
// oldCapacity为旧容量,newCapacity为新容量
int oldCapacity = elementData.length;
//将oldCapacity 右移一位,其效果相当于oldCapacity /2,
//我们知道位运算的速度远远快于整除运算,整句运算式的结果就是将新容量更新为旧容量的1.5倍,
int newCapacity = oldCapacity + (oldCapacity >> 1);
//然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么就把最小需要容量当作数组的新容量,
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//再检查新容量是否超出了ArrayList所定义的最大容量,
//若超出了,则调用hugeCapacity()来比较minCapacity和 MAX_ARRAY_SIZE,
//如果minCapacity大于MAX_ARRAY_SIZE,则新容量则为Interger.MAX_VALUE,否则,新容量大小则为 MAX_ARRAY_SIZE。
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
} |
int newCapacity = oldCapacity + (oldCapacity >> 1);源码是对原数组进行移位操作,新数组容量等于[旧数组容量+旧数组容量 右移一位 ],奇偶不同,二进制最后一位不同,移位后容量就不同
|


No description provided.