Java源码中如何对ArrayList进行容量调整呢?
下文笔者讲述Arraylist扩容的相关源码分析
通过此篇源码分析,你将掌握JDK对ArrayList数组容量的扩容思路
数组扩容的方法
ArrayList中数组扩容是通过调用ensureCapacityInternal方法 达到数组扩容的目的 ensureCapacityInternal方法用于保证数组的容量处于够用状态
ensureCapacityInternal方法的源码
//主方法:用于确保数量够用
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//计算当前容量
//注意事项:
//如果elementData等于null,则返回默认容量10与minCapacity=size+1中的最大值
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
//检测当前ArrayList的实际大小
//此方法用于判断elementData是否够用
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
//minCapacity如果大于了实际elementData的长度
//则说明elementData数组的长度不够用
//增长值为:所需最小空间-数组长度
if (minCapacity - elementData.length > 0)
//ArrayList自动扩容方法
grow(minCapacity);
}
//Array扩容的真真方法
private void grow(int minCapacity) {
//将扩充前的elementData大小给oldCapacity
// overflow-conscious code
int oldCapacity = elementData.length;
//新容量newCapacity是1.5倍的旧容量oldCapacity
int newCapacity = oldCapacity + (oldCapacity >> 1);
//这句话就是适应于elementData就空数组的时候,length=0,那么oldCapacity=0,newCapacity=0,所以这个判断成立,在这里就是真正的初始化elementData的大小了,就是为10。
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//如果newCapacity超过了最大的容量限制,就调用hugeCapacity,也就是将能给的最大值给newCapacity
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//其实扩容是采用数组复制达到数组变大的效果
elementData = Arrays.copyOf(elementData, newCapacity);
}
//为数组赋最大值
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//当minCapacity都大于MAX_ARRAY_SIZE
//则返回Integer.MAX_VALUE返回
//否则将MAX_ARRAY_SIZE返回
//Integer.MAX_VALUE:2147483647
//MAX_ARRAY_SIZE:2147483639
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


