关于Java中的List<User>如何进行深拷贝

联调中发现了一个很初级,但有容易被忽略的拷贝问题:

复制代码
错误方式:

List<User> us = new ArrayList<>(); // name = "张三"

List<User> us1 = new ArrayList<>(us);

for (User u : us) {
    ...
    u.setName("douzi")
}


for (User u : us1) {
    ...
}

System.out.print(us1); // 姓名修改成douzi了

此种拷贝,如果修改了集合us中的User对象,us1会跟着改变;

找了网上很多方式:

1.clone方式

us的方法里边不存在clone;

2.addAll方法

不是深度拷贝,修改了集合us中的User对象,us1会跟着改变

3.us.stream().collect(Collectors.toList())

不是深度拷贝,修改了集合us中的User对象,us1会跟着改变

4.CollectionUtil.copy(us)

不是深度拷贝,修改了集合us中的User对象,us1会跟着改变;

解决方案:

1.原生写法

复制代码
List<User> us = new ArrayList<>();

List<User> us1 = new ArrayList<>(us.size());
for (int i = 0; i < us.size(); i++) {
    User u = us.get(i);
    User tmp = new User();
	BeanUtil.copyProperties(u, tmp, false);
	us1.add(tmp);
}

2.hutool工具

复制代码
List<User> us = new ArrayList<>();

List<User> us1 = CglibUtil.copyList(us, User::new);

总结

有时候老鸟也会晕呀!

相关推荐
f狐0狸x3 小时前
【C++修炼之路】C++ list容器基本用法详解
开发语言·c++·list
松☆3 小时前
Dart 中的常用数据类型详解(含 String、数字类型、List、Map 与 dynamic) ------(2)
数据结构·list
坚持就完事了3 小时前
Java的OOP
java·开发语言
像少年啦飞驰点、4 小时前
零基础入门 Spring Boot:从“Hello World”到可部署微服务的完整学习路径
java·spring boot·微服务·编程入门·后端开发
undsky_4 小时前
【RuoYi-SpringBoot3-Pro】:将 AI 编程融入传统 java 开发
java·人工智能·spring boot·ai·ai编程
不光头强4 小时前
shiro学习要点
java·学习·spring
工一木子4 小时前
Java 的前世今生:从 Oak 到现代企业级语言
java·开发语言
H Journey4 小时前
Linux su 命令核心用法总结
java·linux·服务器·su
小学仔4 小时前
科大镜像科大镜像科大镜像
java
小旭95274 小时前
Java 反射详解
java·开发语言·jvm·面试·intellij-idea