arrays.copyof 用于创建指定长度的新数组并复制原数组前 min(原长, 新长) 个元素,新长超原长时补默认值,不足则截断;底层调用 system.arraycopy,高效但需手动赋值引用,适用于简单扩容场景。

Java 中数组长度固定,但 Arrays.copyOf 能快速创建新数组并复制原内容,是模拟“动态扩容”的常用手段——它不改变原数组,而是返回一个指定长度的新数组,适合在需要临时扩大或缩容时使用。
理解 Arrays.copyOf 的核心行为
该方法本质是创建新数组,并将原数组前 min(原长度, 新长度) 个元素复制过去。若新长度大于原长度,多出位置自动填入默认值(如 int 为 0,Object 为 null);若小于,则只复制前 N 个元素,实现截断。
-
Arrays.copyOf(arr, 10):原数组长度为 5 → 新数组长 10,后 5 位为 0 或 null -
Arrays.copyOf(arr, 3):原数组长度为 5 → 新数组只含前 3 个元素 - 底层调用的是
System.arraycopy,性能高效,无额外对象创建开销
手动实现简易动态数组扩容逻辑
当现有数组快满时,用 copyOf 创建更大数组,再把旧数据搬进去,最后用新数组替换引用:
- 设定扩容因子(如 1.5 倍),避免频繁拷贝
- 检查容量是否足够,不足则调用
Arrays.copyOf(oldArr, newSize) - 注意:必须重新赋值引用,例如
data = Arrays.copyOf(data, newSize); - 不要漏掉元素插入/更新操作——拷贝只是准备容器,业务逻辑仍需单独处理
常见误用与规避建议
容易混淆 copyOf 和 copyOfRange,也常忽略类型匹配和空指针风险:
- 传入 null 数组会直接抛
NullPointerException,使用前建议判空 -
copyOf(int[], int)不能用于Integer[],泛型擦除后类型不兼容,需用copyOf(T[], int, Class)重载 - 缩容时若依赖被截断的元素,可能引发逻辑错误,应确保业务允许丢弃尾部数据
- 高频写场景下,反复调用
copyOf比ArrayList开销大,仅适用于简单、低频或教学场景
替代方案对比:什么情况下不该用 copyOf
虽然轻量,但它只是数组工具,不是完整集合解决方案:
- 需要增删查改全功能 → 直接用
ArrayList,内部已优化扩容策略 - 需线程安全 →
Collections.synchronizedList或CopyOnWriteArrayList - 大量中间态数组且生命周期短 → 可考虑对象池复用,减少 GC 压力
- 纯数值计算密集场景 → 若确定大小可预估,优先一次性分配足额空间,避免多次拷贝
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











