选数组复制方法需看三要素:是否修改原数组、复制范围、性能要求;arrays.copyof()适合完整备份或扩容,自动创建新数组并填充默认值;copyofrange()专用于截取子数组,左闭右开;system.arraycopy()性能最优但需预分配目标数组;复杂逻辑用for循环更直接高效。

选数组复制方法,核心就看三件事:要不要动原数组、拷哪一段、性能压不压力大。
要完整备份或扩容,用 Arrays.copyOf()
它自动建新数组,传进去原数组和想要的长度就行。比如原数组长3,想扩成5,多出两个位置自动填0或null;要是只想拷前2个,传长度2也行。底层调的是 System.arraycopy(),性能稳,代码还干净。
- 适合日常快速备份、防御性拷贝、临时扩容
- 不用操心 new 数组,也不用算长度
- 对基本类型安全;对象数组仍是浅拷贝,引用没变
只要中间一段,优先 Arrays.copyOfRange()
专门干截取的,参数是原数组、起始下标、结束下标(左闭右开)。比如 Arrays.copyOfRange(arr, 3, 7) 就拿第3、4、5、6这四个元素,生成新数组——不用手动建目标数组,越界也不会崩,空位自动补默认值。
- 分页取数据、日志切片、协议字段提取都靠它
- 比先 new 再 arraycopy 更直观,也不容易下标算错
- 内部也是调 System.arraycopy(),效率不打折
高频或大数据量,盯死 System.arraycopy()
这是 JVM 底层 native 实现,速度最快。但它不负责建数组,目标数组必须提前准备好,类型还得匹配。支持任意起点、终点、长度,还能跨数组“拼接”,比如把 A 的后半段贴到 B 的开头。
- 网络包处理、音视频帧搬运、循环复用缓冲区时必用
- 同一数组内移位(比如左移/右移)JVM 会自动选方向,不丢数据
- 别让它和 Arrays.copyOf 混用——后者每次 new 数组,GC 压力大
需要改数据或加条件,老实用 for 循环
当你要跳过 null、只拷正数、把字符串转大写、或者边拷边校验,封装逻辑比硬套工具方法更直接。小数组(比如 ≤4 个元素)甚至比调方法更快,JIT 还可能给它向量化。
- 过滤、映射、转换类操作,可读性和可控性第一
- 避免为了“看起来高级”硬塞 copyOfRange,结果还得再遍历一遍
- 二维数组深拷贝、含函数/Symbol 的 JS 数组,也得自己铺开逻辑











