ArrayList的底层

ArrayList在执行remove或add操作时,可能需要对数组进行扩容。它会基于当前旧数组的长度计算新容量,通常是旧长度的1.5倍。如果新容量小于需求量,会进行特殊处理,包括检查最小容量和处理溢出情况。当超过最大数组大小时,可能会返回Integer.MAX_VALUE。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList:基于数组实现,调用remove(Object o),add()方法时,在底层其实是重新拷贝了一个数组以remove(Object o)举例。

ArrayList的所有操作都是基于数组实现,在我们要在List中添加一个元素的时候,底层会去对数组进行一个扩容,就是重新copy一个数组,而新数组的长度就是旧数组的length+1。他会对这个新数组的长度进行以下判断:

1.他会根据旧数组的长度进行一个判断,newCapactiy(旧数组de length+旧数组的length >> 1 (相当于*2))。如果newCapactiy - 新数组的长度 <=0会进入第二层判断,如果是一个空数组就返回Math.max(DEFAULT_CAPACITY, minCapacity)DEFAULT_CAPACITY=10,minCapacity就是旧数组length+1。如果minCapacity < 0 就抛出异常。如果这两个条件都不满足的话就返回minCapacity。

 int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity <= 0) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return minCapacity;
        }

2.如果不满足条件1的第一层判断的话就会返回以下的内容,MAX_ARRAY_SIZE是Interge.Max -8

return (newCapacity - MAX_ARRAY_SIZE <= 0)
            ? newCapacity
            : hugeCapacity(minCapacity);
hugeCapacity(minCapacity)又会进入判断。如果minCapacity < 0抛出异常。如果minCapacity>MAX_ARRAY_SIZE 就会返回Interge.Max_value,反之就返回Interge.Max -8
private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE)
            ? Integer.MAX_VALUE
            : MAX_ARRAY_SIZE;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值