ArrayList中grow(int minCapacity)方法具有什么功能呢?

书欣 Java经验 发布时间:2022-09-08 17:05:18 阅读数:16836 1
下文笔者讲述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;
}
 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202209/16626279634392.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者