在 Java 中ArrayList 是一个动态数组,ArrayList扩容机制是在容量不足时,自动增加容量并将元素复制到新的数组中。
ArrayList 的扩容机制如下,主要就是三个步骤:
第一步:创建一个新数组
当 ArrayList 中元素数量超过其容量时,会创建一个新的数组来替代原来的数组。
第二步:默认扩容为1.5倍
如果数组需要的容量大于数组容量的时候会,调用grow方法给数组扩容。
如下所示:
// 初始容量为10 javaCopy codeArrayList<Integer> arrayList = new ArrayList<>(10); // 当添加第11个元素时,容量不足,将自动扩容为15 arrayList.add(11);
ArrayList初始化容量为10,当第11个元素加入,数组需要的容量大于数组容量了,这个时候就会调用grow方法给数组扩容。
如下所示:
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); }
grow方法将数组扩容1.5倍,如果扩容1.5倍以后还比最小值小的话,将minCapacity复制给新的容量。
第三步:把新元素添加到扩容以后的数组中
最后使用Arrays工具类的copyOf方法复制数组,这样ArrayList 就完成了扩容。
如下所示:
elementData = Arrays.copyOf(elementData, newCapacity);
如果在添加元素时,ArrayList 的容量不够,又需要进行扩容操作,则重复上述步骤。
需要注意的是,ArrayList 的扩容操作可能会导致性能问题,因为每次扩容都需要创建新的数组并复制元素。
因此,可以通过预设合适的容量来避免不必要的扩容操作,从而提高程序的性能。
以上就是ArrayList扩容机制的详解,更多关于ArrayList的内容,请查看:ArrayList全面详解(看这篇就够了)。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》