【Java成神之路】ArrayList 的扩容机制?

2022-03-11 10:07:03  晓掌柜  版权声明:本文为站长原创文章,转载请写明出处


一、先说结论

    1.ArrayList每次扩容是原来得1.5倍。

    2.数组进行扩容时,会将老数据中得元素重新拷贝一份道新的数组中,每次数组容量得增长大于时原用量得1.5倍。

    3.代价是很高得,因此再实际使用时,我们因该避免数组容量得扩张。尽可能避免数据容量得扩张。尽可能,就至指定容量,避免数组扩容的发生。

    4.创建方式不同,容量不同。

        

二、源码部分分析

    1、扩容发生的事件点

        ArrayList是在数组增加时触发的(即调用add()时)。

        

    2、数组为空时的处理

        

        ① 数组为空时的判断

        ② 为空时最小扩容取:默认扩容大小与传入的扩容长度的最大值

    3、是否需要真正扩容

        

    4、如何进行扩容

        

        ① 先拿到旧的数组长度

        ② 把当前长度扩充为1.5倍

        ③ 检测扩充后的长度是否满足要求,满足则使用1.5倍的长度

        ④ 检测是否最大长度溢出(安全监测,长度小于0时抛出异常、不能超出最大长度)

        ⑤ 把扩容后的长度,复制给原数组

        PS: 检测部分如下:

        

        


最新评论: