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

总结

有时候老鸟也会晕呀!

相关推荐
带刺的坐椅35 分钟前
Solon Expression Language (SnEL):轻量高效的Java表达式引擎
java·solon·snel·表达式语言
老马啸西风40 分钟前
从零开始手写redis(18)缓存淘汰算法 FIFO 优化
java
Java中文社群1 小时前
超实用!SpringAI提示词的4种神级用法
java·人工智能·后端
代码or搬砖1 小时前
Spring JDBC配置与讲解
java·数据库·spring
魔芋红茶1 小时前
Spring 源码学习 3:工厂后处理器
java·学习·spring
m0_634865401 小时前
sa-token:我将代替你,Spring Security
java·后端·spring
蚰蜒螟1 小时前
Spring与SLF4J/Logback日志框架深度解析:从源码看日志系统设计
java·spring·logback
明天不吃。2 小时前
【数据结构】七种常见排序算法
java·数据结构·排序算法
崔小汤呀2 小时前
java8-java17新特性总结
java
喵手2 小时前
如何高效进行对象拷贝?浅拷贝与深拷贝的陷阱,你知道吗?
java·后端·java ee