array.clone()对基本类型数组是深拷贝效果,对对象数组仅为浅拷贝,只复制引用不复制对象;深拷贝需手动遍历调用元素clone()或改用Arrays.copyOf、构造器、序列化等更安全方案。

clone() 对数组只是浅拷贝,基本类型和引用类型表现不同
Java 中 array.clone() 看似简单,但行为有关键差异:对 基本类型数组(如 int[]、boolean[]),它确实复制了每个元素的值,效果等同于深拷贝;但对 对象数组(如 String[]、Person[]),它只复制引用,不复制对象本身。这意味着两个数组指向同一组对象实例——改一个数组里某个元素的状态,另一个数组“看到”的也是改后的状态。
clone() 无法递归处理嵌套对象,深拷贝需额外逻辑
即使你重写了元素类的 clone() 方法并实现了 Cloneable,array.clone() 也不会自动调用这些方法。它只做一层复制:新数组是新的,但数组内每个元素仍是原对象的引用。要真正隔离,必须手动遍历并逐个克隆元素,例如:
- 循环调用 element.clone()(要求每个元素都支持且正确实现)
- 或用 Arrays.stream(arr).map(e -> e.clone()).toArray()(需泛型适配)
- 否则会抛出 CloneNotSupportedException 或运行时 ClassCastException
更清晰、更可控的替代方案推荐
相比依赖 clone() 这个语义模糊、易出错的机制,以下方式更直观、安全:
- Arrays.copyOf(arr, arr.length):语义明确,创建新数组并复制元素,适合基本类型或不可变对象(如 String)
- System.arraycopy(src, 0, dst, 0, len):高性能,适用于已分配目标数组的场景
- 构造器/工厂方法:为业务对象设计显式拷贝逻辑,比如 new Person(person) 或 Person.copyFrom(person)
- 序列化反序列化(如 SerializationUtils.clone(obj)):能跨层级实现深拷贝,但要求所有字段可序列化,且有性能开销
实际选型建议:按数据结构复杂度决定策略
简单一维数组、元素为不可变类型(String、Integer、LocalDate),用 Arrays.copyOf 就足够;若含可变对象且需完全隔离,优先封装拷贝逻辑到领域类中;若结构深层嵌套、字段繁多,可引入 Apache Commons Lang 的 SerializationUtils 或 Jackson 的 readValue(writeValueAsBytes(obj), type) 实现通用深拷贝——但务必注意序列化兼容性和 transient 字段处理。
立即学习“Java免费学习笔记(深入)”;


















