ArrayList 源码理解

22 篇文章 0 订阅

扩容机制:

源码如下:

minCapacity:最小需要的容量,也就是说存储数据的数组最小需要minCapacity所指定小长度。

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(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);
}

一、先判断最小需要的长度是否大于原本数组的长度,如果大于,才需要扩容。

二、根据原本数组的长度扩容一半,代码如下:elementData是ArrayList中存储真实数据的数组

int oldCapacity = elementData.length;

int newCapacity = oldCapacity + (oldCapacity >> 1);

 

三、扩容后的新长度与最小需要的长度对比,取值比较大的那个。

四、判断要扩容的新长度是否会超过jvm对数组长度的限制(Integer.MAX_VALUE-8),如果大于Integer.MAX_VALUE-8,那就尝试创建Integer.MAX_VALUE长度的数组,此时在有些虚拟机上会溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值