Java数组克隆需分场景处理:基本类型和String数组用clone()即可实现深拷贝;对象数组则存在浅拷贝陷阱,须逐个克隆或序列化;Arrays.copyOfRange()和copyOf()适合截取或扩容。

Java 数组克隆不是简单调用一个方法就完事,尤其当数组里存的是对象时——clone() 只复制引用,不复制对象本身。想真正保护原数组内容不被后续修改影响,必须分层处理:数组壳要独立,里面的可变对象也得各自深拷贝。
基本类型数组:clone() 最简最安全
int、double、boolean 等数组用 clone() 即可完成真正的深拷贝,语法干净,性能好,无需额外依赖。
- 直接写
int[] copy = original.clone();,不用转型(编译器自动推导) - 修改
copy[0]不会影响original,底层是内存块复制 - 避免写成
(int[])original.clone()——冗余且易引发类型误判
字符串数组:clone() 依然够用
String 是不可变对象,即使 clone() 只复制引用,也不会导致意外修改。所以 String[] wordsCopy = words.clone(); 完全安全。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 适合日志缓存、配置快照、DTO 转换等场景
- 比
Arrays.copyOf()少一个参数,代码更紧凑 - 注意:若数组中混入了自定义可变类(如
MutableString),就不能再依赖此方案
对象数组:浅拷贝陷阱与应对策略
对 Person[] 或 List[] 这类数组,clone() 和 Arrays.copyOf() 都只复制数组容器和元素引用,原对象仍被共用。
立即学习“Java免费学习笔记(深入)”;
- 修改
copy[0].setName("X"),original[0]名字也会变 - 若元素类实现了
Cloneable并重写了clone(),可用循环逐个克隆:copy[i] = (Person) src[i].clone(); - 结构复杂(含嵌套集合、Date、Map 等)时,推荐序列化方式或使用 MapStruct 显式映射,避免递归失控
按需截取或扩容:用 Arrays.copyOfRange() 和 Arrays.copyOf()
不需要完整拷贝时,这两个方法语义清晰、边界安全,比手算下标 + System.arraycopy() 更可靠。
-
Arrays.copyOfRange(data, 5, 10)取索引 5~9,自动处理越界(超出则补 null 或 0) -
Arrays.copyOf(original, 20)扩容后多出位置填默认值,适合构建缓冲区或预分配结果集 - 它们内部都调用
System.arraycopy(),性能接近原生,但省去目标数组创建步骤

















