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

总结

有时候老鸟也会晕呀!

相关推荐
别动我齐刘海2 分钟前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
code2cat1 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe1 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码1 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
wewowilling2 小时前
认识微服务
java·运维·微服务·springcloud
代码什么用2 小时前
Java Web 7-10
java·servlet
蜗牛互联网4 小时前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
java·人工智能·后端
SL_staff4 小时前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays10114 小时前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找