ArrayList 的扩容机制?
推荐阅读:
https://juejin.im/post/5d42ab5e5188255d691bc8d6
- 当使用 add 方法的时候首先调用 ensureCapacityInternal 方法,传入 size+1 进去,检查是否需要扩充 elementData 数组的大小;
- newCapacity = 扩充数组为原来的 1.5 倍(不能自定义),如果还不够,就使用它指定要扩充的大小 minCapacity ,然后判断 minCapacity 是否大于 MAX_ARRAY_SIZE(Integer.MAX_VALUE – 8) ,如果大于,就取 Integer.MAX_VALUE;
- 扩容的主要方法:grow;
- ArrayList 中 copy 数组的核心就是 System.arraycopy 方法,将 original 数组的所有数据复制到 copy 数组中,这是一个本地方法。
评论(2)
使用ArraryList()无参构造的时候,会使用长度为0的数组。
使用ArrayList(int initialCapacity)构造时,会使用指定容量的数组。
使用public ArrayList(Colection<? extends E> c)的时候,会使用c的大小作为数组容量。
使用ArrayList 调用add(Object o)方法,首次扩容会从0扩容成10,再次扩容会扩容到上一次容量的1.5倍,比如0,10,15,22,33…….
调用addAll(Colection c)方法时,当前没有元素(容量为0的话),首次扩容会max(10,实际元素个数)(从10和实际加入元素个数中选择最大容量进行扩容),当前存在有元素时,则max(原容量1.5倍,实际元素个数)
addAll()方法总是选择“扩容一次后的容量”与“旧容量加上添加的元素个数的容量”中取一个最大值作为新的容量,比如:当前ArrayList中有10个元素,而addAll()方法需要添加6个元素,当ArrayList触发扩容后的新容量应该为15,而旧容量加上需要添加的元素容量为16,从中取一个较大值为16,所以新容量应该为16。