java中复制arraylist分浅拷贝和深拷贝:构造函数、addall()、stream().collect()均实现浅拷贝,适用于string等不可变类型;深拷贝需手动处理,如元素实现cloneable、使用拷贝构造函数或序列化。

Java 中复制 ArrayList 有多种方式,关键看你是需要浅拷贝(新列表引用原元素)还是深拷贝(连元素本身也复制一份)。大多数日常场景用浅拷贝就够了。
构造函数:最常用、最简洁的浅拷贝
直接用 ArrayList 的构造函数传入原列表,会创建一个新对象,但内部元素引用不变:
ArrayList<string> original = new ArrayList(Arrays.asList("a", "b", "c"));
ArrayList<string> copy = new ArrayList(original);</string></string>
✅ 适合 String、Integer 等不可变类型;⚠️ 若元素是自定义可变对象(比如 Person),修改 copy 中某个 Person 的字段,original 里对应对象也会被影响。
addAll() 方法:适合已有目标列表时追加复制
如果已经有一个空或非空的 ArrayList,想把原列表内容加进去:
- ArrayList
copy = new ArrayList(); - copy.addAll(original);
效果和构造函数一致,也是浅拷贝。适合在循环中累积添加,或需复用已有列表对象的场景。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
stream().collect():函数式写法(Java 8+)
一行代码实现浅拷贝,语义清晰,适合链式操作:
ArrayList<string> copy = original.stream()
.collect(Collectors.toCollection(ArrayList::new));</string>
本质仍是浅拷贝,底层调用了 ArrayList 的构造逻辑。注意别漏掉 toCollection(ArrayList::new),否则得到的是通用 List,不一定是 ArrayList。
深拷贝:当元素本身也要独立副本时
没有通用一键深拷贝方法,需根据情况处理:
-
元素实现 Cloneable:遍历原列表,对每个元素调用
clone(),再加入新列表; -
有拷贝构造函数或 builder:例如
new Person(p.getName(), p.getAge()); - 序列化(慎用):通过 ObjectOutputStream/ObjectInputStream 实现,要求所有元素都可序列化,且性能较差,一般只用于特殊需求。
深拷贝必须明确知道元素类型和结构,无法靠容器自动完成。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










