arraylist所有标准api均为浅拷贝,仅复制容器结构和元素引用;深拷贝需手动遍历克隆每个元素、用构造函数重建对象、序列化反序列化或借助第三方库实现。

ArrayList 本身没有内置的深拷贝方法,所有标准 API(如 clone()、构造函数 new ArrayList(list)、addAll()、Collections.copy()、Stream 收集)都只做浅拷贝——即复制容器结构和元素引用,不复制元素对象本身。要真正实现深拷贝,必须让每个元素对象也生成独立副本。
手动遍历 + 元素克隆(推荐用于可控场景)
前提是元素类型实现了 Cloneable 并正确重写了 clone() 方法(且该方法是递归深克隆):
- 遍历原列表,对每个元素调用
clone() - 将克隆后的对象加入新 ArrayList
- 注意:若元素内部还包含可变对象(如 List、Map、自定义类字段),其
clone()必须也递归处理,否则仍是浅层
示例:
Listfor (User u : original) {
deepCopy.add(u.clone()); // 要求 User.clone() 返回全新对象,且字段全复制
}
使用构造函数或 Builder 创建新实例
更清晰、更可控,避免 Cloneable 的语义模糊和异常风险:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 遍历原列表,用每个元素的字段构造新对象
- 适合有明确构造参数或 Builder 模式的类
- 天然支持嵌套对象的逐层复制逻辑
示例:
List.map(u -> new User(u.getName(), u.getAge(), u.getAddress().clone()))
.collect(Collectors.toList());
序列化反序列化(通用但有约束)
适用于无法修改元素类源码,或对象图较复杂但满足序列化条件的情况:
- 所有元素类及其所有字段类型都必须实现
Serializable - 不能含
transient关键字段(否则丢失数据) - 性能开销大,不适用于高频或大数据量场景
示例(需捕获异常):
ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(original);
oos.close();
ObjectInputStream ois = new ObjectInputStream(
new ByteArrayInputStream(bos.toByteArray()));
List
第三方工具辅助(适合工程化项目)
减少重复代码,提升可维护性:
-
SerializationUtils.clone()(Apache Commons Lang):封装了序列化逻辑 -
MapStruct或Dozer:适合 DTO 与实体间深度映射 - 注意:仍依赖目标类可序列化或提供映射规则










