Arrays.copyOf本身不支持动态扩容,需配合手动管理引用、控制扩容时机(如负载因子0.75)、倍数(推荐1.5倍)及引用切换;通过ensureCapacity封装扩容逻辑,add前调用,实现平滑弹性扩容。
arrays.copyof 本身不提供“动态”扩容能力,它只是一次性复制并创建新数组。所谓“平滑弹性扩容”,其实是配合手动管理数组引用、按需调用 copyof 实现的逻辑策略——核心在于**控制扩容时机、倍数与引用切换**,避免频繁复制,同时保持使用简洁性。
明确扩容触发条件:别等满了才动
等到数组填满再扩容,下一次 add 就必然失败或抛异常。应预留空间:
- 维护一个
size字段记录当前有效元素个数(非数组长度) - 当
size == array.length时,说明已无空位,触发扩容 - 更优做法:在
size >= array.length * 0.75(即负载因子 0.75)时预扩容,减少临界点抖动
选择合理扩容倍数:2 倍是经典,但不是唯一
每次扩容都新建数组并复制,代价不小。倍数影响时间/空间权衡:
-
推荐 1.5 倍(如
(int)(oldLength * 1.5)):比 2 倍节省内存,又避免过于频繁扩容(如 1.1 倍) - 首次扩容可设最小容量(如 8 或 16),避免小数组反复扩
- 用
Math.max(minCapacity, (int)(oldLength * 1.5))综合兜底
用 copyOf 完成安全替换:一行代码搞定复制+新数组
不要手动循环复制。直接用 Arrays.copyOf 最简洁可靠:
-
array = Arrays.copyOf(array, newSize);—— 自动处理类型、边界、null 安全 - 若原数组是
int[],copyOf返回仍是int[];泛型数组需用copyOf(T[], int, Class) - 新长度大于原长时,末尾自动补默认值(
0、false、null);小于则截断
封装成可复用逻辑:避免每次重复判断
把扩容检查和复制收进一个方法,调用方只关注“加数据”:
- 写一个
ensureCapacity(int minCapacity)方法,内部做“是否扩容 + copyOf” - 在
add(E e)开头调用它,传入size + 1 - 这样上层完全不用感知数组长度变化,语义清晰,也便于后续替换为 ArrayList 等实现

















