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

总结

有时候老鸟也会晕呀!

相关推荐
用户37215742613519 分钟前
Java 设置 Word 文档编辑限制并允许指定区域编辑
java
宠友信息39 分钟前
社区类源码开发实践中的仿小红书系统技术要点分析
java·spring boot·redis·mysql·uni-app·vue·内容运营
用户3721574261351 小时前
Java 设置 PDF 表单域只读或扁平化
java
luteres2 小时前
Spring学习笔记
java·后端·spring
南城以南溫暖如初1472 小时前
从零搭建24小时自助健身系统:技术选型与核心模块实战
java·spring boot·redis·mysql·vue·mybatis
重生之后端学习2 小时前
53. 最大子数组和[中等]✅
java·数据结构·算法·leetcode·职场和发展
XS0301062 小时前
【无标题】
java·tomcat·maven·intellij-idea
陈皮波比茶3 小时前
java日志框架
java
thefool1122663 小时前
随机链表的复制
java
jvmind_dev3 小时前
SWT 堆外内存泄漏排查实录:一次 PNG 保存泄漏一张图,一行 g_free 治好
java·后端