ArrayList 的扩容机制?

推荐阅读:

https://juejin.im/post/5d42ab5e5188255d691bc8d6

  1. 当使用 add 方法的时候首先调用 ensureCapacityInternal 方法,传入 size+1 进去,检查是否需要扩充 elementData 数组的大小;
  2. newCapacity = 扩充数组为原来的 1.5 倍(不能自定义),如果还不够,就使用它指定要扩充的大小 minCapacity ,然后判断 minCapacity 是否大于 MAX_ARRAY_SIZE(Integer.MAX_VALUE – 8) ,如果大于,就取 Integer.MAX_VALUE;
  3. 扩容的主要方法:grow;
  4. ArrayList 中 copy 数组的核心就是 System.arraycopy 方法,将 original 数组的所有数据复制到 copy 数组中,这是一个本地方法。

发表评论

后才能评论

评论(2)

  • mpweixin用户 普通 2023-04-03 1:55 下午

    使用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倍,实际元素个数)

  • 一蓑烟雨 普通 2022-09-28 3:07 下午

    addAll()方法总是选择“扩容一次后的容量”与“旧容量加上添加的元素个数的容量”中取一个最大值作为新的容量,比如:当前ArrayList中有10个元素,而addAll()方法需要添加6个元素,当ArrayList触发扩容后的新容量应该为15,而旧容量加上需要添加的元素容量为16,从中取一个较大值为16,所以新容量应该为16。