要求

    • 掌握 ArrayList 扩容规则

    扩容规则

    1. ArrayList() 会使用初始长度为零的数组
    2. ArrayList(int initialCapacity) 会使用指定容量的数组
    3. public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组容量
    4. add(Object o) 首次扩容为 10,再次扩容为上次容量的 1.5 倍 (实际上是移位,15>>1=7 7+15=22)
    5. addAll(Collection c) 没有元素时,扩容为 Math.max(10, 实际元素个数),有元素时为 Math.max(原容量 1.5 倍, 实际元素个数)

    其中第 4 点必须知道,其它几点视个人情况而定
    提示

    • 注意的是,示例中用反射方式来更直观地反映 ArrayList 的扩容特征,但从 JDK 9 由于模块化的影响,对反射做了较多限制,需要在运行测试代码时添加 VM 参数 —add-opens java.base/java.util=ALL-UNNAMED 方能运行通过,后面的例子都有相同问题