关于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);

总结

有时候老鸟也会晕呀!

相关推荐
功德+n5 分钟前
在 Maven 中使用 <scope> 元素:全面指南
java·maven
失业写写八股文24 分钟前
Java类加载阶段深度解析:三步走全流程详解
java
yyueshen32 分钟前
单例模式,有必要用volatile么?
java·单例模式·设计模式
一条闲鱼_mytube33 分钟前
[Kubernetes] 7控制平面组件
java·平面·kubernetes
Y雨何时停T1 小时前
Spring IoC 详解
java·spring·rpc
&白帝&1 小时前
Java @PathVariable获取路径参数
java·开发语言·python
Yuanymoon1 小时前
【由技及道】镜像星门开启:Harbor镜像推送的量子跃迁艺术【人工智障AI2077的开发日志010】
java·docker·jenkins·harbor·devops
木胭脂沾染了灰2 小时前
策略设计模式-下单
java·前端·设计模式
sevevty-seven2 小时前
Spring Boot 自动装配原理详解
java·spring boot·后端
Forget the Dream4 小时前
设计模式之迭代器模式
java·c++·设计模式·迭代器模式