联调中发现了一个很初级,但有容易被忽略的拷贝问题:
错误方式:
List<User> us = new ArrayList<>();
List<User> us1 = new ArrayList<>(us);
此种拷贝,如果修改了集合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);
总结
有时候老鸟也会晕呀!
标签:Java,ArrayList,List,us,User,us1,new From: https://blog.csdn.net/qq_16116549/article/details/142529986