ArrayList中grow(int minCapacity)方法具有什么功能呢?
下文笔者讲述Arraylist中grow(int minCapacity)方法的功能简介说明,如下所示
grow方法的功能:
增加容量,以确保它至少可以容纳
最小容量参数指定的元素数
grow(int minCapacity)方法源码
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
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);
}
源码解析
//将数组长度赋给oldCapacity
int oldCapacity = elementData.length;
//新的数组容量=老的数组长度的1.5倍。oldCapacity >> 1 相当于除以2
int newCapacity = oldCapacity + (oldCapacity >> 1);
//当新的数组容量newCapacity小于传入的参数要求的最小容量minCapacity,那么新的数组容量以传入的容量参数为准
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//当新的数组容量newCapacity大于数组能容纳的最大元素个数 MAX_ARRAY_SIZE 2^{31}-1-8
//再判断传入的参数minCapacity是否大于MAX_ARRAY_SIZE,如果minCapacity大于MAX_ARRAY_SIZE
//那么//newCapacity等于Integer.MAX_VALUE,否者newCapacity等于MAX_ARRAY_SIZE
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
另3个判断的说明
if (newCapacity - minCapacity < 0)
if (newCapacity - MAX_ARRAY_SIZE > 0)
以及hugeCapacity(minCapacity);函数中的:
(minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
//当重新计算的容量(x1.5那个计算)小于传入要求容量参数
//则新容量以传入的比较大的容量参数为准。
//当传入容量参数太大
//大到超过了数组的容量限定值却又小于整数限定值 -1
//那么新的数组容量以整数限定值 -1为准
//但是当传入的容量参数不大于数组的容量限定值时,以容量限定值为准
//MinCapacity通常接近size
//把旧数组放进新的扩容后的数组
elementData = Arrays.copyOf(elementData, newCapacity);
Integer.MAX_VALUE:整型的最大值 -1
@Native public static final int MAX_VALUE = 0x7fffffff;
MAX_ARRAY_SIZE:
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
hugeCapacity:
传入的参数必须大于0,否者报错
判断传入的参数minCapacity是否大于MAX_ARRAY_SIZE
当minCapacity大于MAX_ARRAY_SIZE
返回Integer.MAX_VALUE,否者返回MAX_ARRAY_SIZE
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


