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; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。