clone()仅浅拷贝:基本类型数组完全隔离;引用类型数组仅复制引用,元素对象共享;多维数组仅复制外层,子数组仍共用。

Java 中 clone() 方法是数组拷贝最轻量、最直接的方式,但它不是“万能复制键”,用对了省事,用错了容易埋坑。关键在于理解它只做一层复制,且行为因数组类型而异。
基本类型数组:一行搞定,改不干扰
int[]、double[]、boolean[] 这类数组用 clone() 安全又高效——新数组和原数组内存完全隔离,改一个不影响另一个。
- 写法简洁:
int[] copy = original.clone();(JDK 5+ 不强制转型,但显式写(int[])更清晰) - 无需判空处理(null 调用会抛
NullPointerException,所以使用前建议检查) - 不依赖额外 import,也不触发任何异常(
CloneNotSupportedException在数组上不会抛出)
对象数组:复制的是“地址”,不是“人”
String[]、Person[] 等引用类型数组调用 clone() 后,数组本身是新的,但每个元素仍指向原来的对象。修改对象内部状态,两个数组都会感知到。
- 例如:
people.clone()得到的新数组copy,执行copy[0].setName("Tom"),原数组people[0]名字也变了 - 若需真正隔离,必须手动深拷贝每个元素,比如循环调用
element.clone()(前提是该类正确实现Cloneable) - 别指望
Arrays.copyOf()或clone()自动帮你递归克隆嵌套对象
多维数组:顶层数组新,子数组共用
二维数组如 int[][] 实际是“一维数组的数组”,clone() 只复制外层数组引用,所有子数组仍是同一份。
-
matrix.clone()后,matrix[0] == copy[0]为 true —— 改copy[0][1]就等于改matrix[0][1] - 可靠做法是逐行克隆:
for (int i = 0; i -
Arrays.copyOf()和System.arraycopy()对多维数组同样只浅拷贝,不能替代逐行操作
实用避坑提醒
几个高频失误点,日常写代码时稍加注意就能避开:
- 别对可能为
null的数组直接调用clone(),先判空再操作 - 避免写成
(int[])arr.clone()—— 编译通过但冗余,还可能误导后续维护者 - 泛型集合(如
List<person></person>)不能靠clone()深拷贝,必须自己遍历处理 - 如果对象结构复杂或不确定是否可克隆,优先考虑 JSON 序列化(如 Jackson
readValue(writeValueAsString(obj), type))或不可变设计
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











