每日一道面试题---ArrayList的自动扩容机制(口述版本)
首先,ArrayList是基于动态数组实现的,它的容量是可以动态增长的,ArrayList的默认容量是10,当我们向ArrayList中插入一个数据时,第一步,会先进行一个条件的校验操作,先去判断ArrayList是不是一个刚刚创建的数组,如果ArrayList是刚刚创建的数组且ArrayList中没有添加任何元素,此时不会触发扩容操作,而是直接分配一个新数组。
如果ArrayList不是一个刚刚创建的数组,当我们向ArrayList中插入数据时,先去判断要不要进行进行扩容操作,如果此时ArrayList已满,就会触发扩容操作,此时就会调用grow方法去实现扩容,在扩容时,是按照默认容量的1.5被去扩容,在真正去扩容之前会先检测新容量合不合法,防止新容量会不会太大导致扩容失败,如果新容量符合预期,ArrayList 会调用Arrays.copyof()方法创建一个新数组,并将旧数组的所有元素复制到新数组中,最后替换elemenData引用,让elemenData指向一个新数组并返回elemenData,最终完成扩容
为什么会是1.5被扩容呢?
1.5倍扩容是一个折中的方案,能够在空间利用率和扩容频率之间取得平衡,如果扩容的倍数太小,则会导致频繁扩容,影响性能,如果扩容的倍数太大,就可能导致ArrayList长期为填满,就会导致空间的浪费