arraylist默认浅拷贝,深拷贝需手动实现:浅拷贝仅复制容器结构,元素引用不变;深拷贝须逐个复制元素对象,方式包括clone()、拷贝构造、序列化或json工具,嵌套集合需递归处理。

ArrayList 默认是浅拷贝,深拷贝需要手动实现——关键在于元素本身是否也被复制。
浅拷贝:直接构造或 clone() 即可
浅拷贝只复制 ArrayList 容器结构,内部元素引用不变。以下方式都属于浅拷贝:
- new ArrayList(original):最常用,创建新 list,但所有元素对象仍是原引用
- original.clone():返回 Object,需强制转型;同样只复制引用
- Collections.copy(dest, src):要求 dest 已有足够容量,也是引用复制
如果 ArrayList 存的是 String、Integer 等不可变对象,浅拷贝基本够用(因为无法被意外修改);但如果存的是自定义可变对象(如 Person、List 等),改副本里的对象会影响原 list。
深拷贝:必须逐个复制元素对象
深拷贝要求容器和每个元素都新建实例。没有通用一行解,取决于元素类型:
- 元素实现了 Cloneable + 重写 clone():遍历原 list,对每个元素调用 clone() 后加入新 list
- 元素有拷贝构造函数:如 new Person(p.getName(), p.getAge()),适合已知结构的类
- 使用序列化(通用但有局限):把原 list 序列化成字节数组再反序列化。要求所有元素及字段都实现 Serializable,且不包含线程、IO 流等不可序列化对象
- 用 JSON 工具(如 Jackson/Gson):先转成 JSON 字符串,再解析为新对象。简单但有性能开销,且要求对象可被 JSON 映射(如 public 字段或 getter/setter)
举个实用例子:Person 列表的深拷贝
假设 Person 类有 name 和 age 字段,且已提供拷贝构造函数:
ArrayList<person> original = new ArrayList();
original.add(new Person("Alice", 25));
original.add(new Person("Bob", 30));
ArrayList<person> deepCopy = new ArrayList();
for (Person p : original) {
deepCopy.add(new Person(p)); // 调用拷贝构造
}
</person></person>
这样修改 deepCopy.get(0).setName("Alicia") 不会影响 original 中的对象。
注意:嵌套集合要递归深拷贝
如果 Person 内部还有 List
,光拷贝 Person 不够——Address 列表也得深拷贝。此时建议用序列化或 JSON 方式,避免手动递归出错。工具类如 Apache Commons Lang 的 SerializationUtils.clone() 就是基于序列化的封装,用起来更简洁。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











