Java ArrayList 的扩容机制是其核心特性之一,目的是在元素数量接近当前数组容量时,通过动态调整数组大小来保证新增元素有足够的存储空间。其底层扩容逻辑可总结为以下几个关键点:
当调用 add()
或 add(int index, E element)
等方法添加元素时,ArrayList 会先检查当前数组容量是否足够(即 size + 1
是否超过数组长度)。如果不足,则触发扩容。
扩容的核心步骤在 grow()
方法中实现,具体规则如下:
int newCapacity = oldCapacity + (oldCapacity >> 1)
(oldCapacity >> 1
等价于 oldCapacity / 2
,效率更高)。ensureCapacityInternal()
确定所需的最小容量(minCapacity = size + 1
)。minCapacity
超过当前数组长度,则调用 grow()
方法。Arrays.copyOf()
生成一个新容量的数组,并将原数组中的元素复制到新数组中,最后替换原数组引用。new ArrayList()
,初始数组为空(EMPTY_ELEMENTDATA
),第一次添加元素时会直接扩容到默认容量 10。new ArrayList(5)
),则初始数组长度为指定值,后续扩容仍按 1.5 倍规则执行。假设初始容量为 10,扩容过程如下:
ArrayList 的扩容机制通过“按需动态扩容”实现了灵活的容量管理,默认以 1.5 倍方式扩容,平衡了内存占用和操作效率(复制元素的时间复杂度为 O(n),但扩容频率较低)。如果能预估元素数量,建议在初始化时指定合适的容量,减少扩容次数以优化性能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。