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

总结

有时候老鸟也会晕呀!

相关推荐
m0_535064602 分钟前
C++模版编程:类模版与继承
java·jvm·c++
虾条_花吹雪1 小时前
Using Spring for Apache Pulsar:Message Production
java·ai·中间件
tomorrow.hello1 小时前
Java并发测试工具
java·开发语言·测试工具
Moso_Rx1 小时前
javaEE——synchronized关键字
java·java-ee
张小洛1 小时前
Spring AOP 是如何生效的(入口源码级解析)?
java·后端·spring
DKPT2 小时前
Java设计模式之行为型模式(观察者模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
追风少年浪子彦2 小时前
mapstruct与lombok冲突原因及解决方案
java·spring boot·spring·spring cloud
why技术2 小时前
也是出息了,业务代码里面也用上算法了。
java·后端·算法
她说人狗殊途2 小时前
java.net.InetAddress
java·开发语言
天使day2 小时前
Cursor的使用
java·开发语言·ai