浅析ArrayList的扩容机制 移除机制

扩容机制

ArrayList的底层是数组,因此ArrayList的扩容机制就是依靠Arrays.copyOf()实现的 但是在具体的判断上要说明一下:
当ArrayList创建出来时,如果给了初始容量,那么就会有一个初始容量
image
如果没有设置 那么初始容量就默认为10
容量设置发生在第一次添加数据前 接着就是根据代码不断向其中添加数据
当第10次添加数据时,整个ArrayList就被填满了
此时如果继续添加 那么在第11次添加数据前,系统就会自动对ArrayList进行扩容:
image
从代码可以看出新的容量是原有容量的1.5倍 因为 变量>>1 代表着数据除以2

在上次扩容后,新容量为15,那么在第16次添加数据时 底层又会在原15的容量上扩容1.5倍 然后向下取整
以后的趋势是越扩容越大(底数越来越大 扩容1.5倍不变)
image

移除机制

为什么java的hashmap不支持动态缩小容量? - 知乎 (zhihu.com)
ArrayList的移除机制和数组相同,也是将被删除数据的后置位数据往前移,依次覆盖前一个数据
不同的是ArrayList在删除数据后,容量不会改变
也就是说如果ArrayList此时容量为15,那么即便我删除到只剩下一个数据,容量也不会修改回10
image
Java在大部分情况下都是用空间换时间的,缩容这种不符合Java的哲学

由于ArrayList的删除机制与数组一样,所以如果ArrayList里有1000个数据,我要移除第10个数据,那么后面990个数据也得动
因此ArrayList移除数据的效率很低

posted @ 2021-08-11 11:42  夏·舍  阅读(86)  评论(0编辑  收藏  举报