list复制出新的list后修改元素,也更改了旧的list?

例子

addAll()

java 复制代码
    @Test
    public void CopyListTest(){
        Student student = Student.builder().id(1).name("张三").age(23).classId(1).build();
        Student student2 = Student.builder().id(2).name("李四").age(22).classId(1).build();

        List<Student> students = new ArrayList<>();
        students.add(student);
        students.add(student2);
        System.out.println("旧的list");
        for (Student stu : students){
            System.out.println(stu);
        }
        List<Student> list2 = new ArrayList<>();
        list2.addAll(students);
        list2.stream().forEach(t->t.setClassId(2));
        System.out.println("新的list");
        for (Student stu : list2){
            System.out.println("班级id"+stu.getClassId());
        }
        System.out.println("旧的list");
        for (Student stu : students){
            System.out.println("班级id"+stu.getClassId());
        }
    }

旧的list的值被改变

直接用 newList = oldList 是引用传递,复制的是地址

改变oldList里的内容同样也会影响到newList

newList.addAll(oldList)是值传递

参考:http://t.csdnimg.cn/EGcYC

但 用allAll() 原来的值也被改变了

解决

使用深度复制

java 复制代码
  public static <T> List<T> deepCopy(List<T> sourceList) throws IOException, ClassNotFoundException{
        ByteArrayOutputStream bo= new ByteArrayOutputStream();
        ObjectOutputStream oos= new ObjectOutputStream(bo);
        oos.writeObject(sourceList);
        ByteArrayInputStream bi= new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream ois=new ObjectInputStream(bi);
        @SuppressWarnings("unchecked")
        List<T> dest = (List<T>)ois.readObject();
        return dest;
    }

所复制的元素如果是对象,需要实现序列化。

参考:http://t.csdnimg.cn/EGcYC

如果所复制的元素是字符

java 复制代码
    List<String> newList=new ArrayList<String>(oldList);
相关推荐
Mr_hwt_1234 小时前
Windows安装Claude Code详细教程(含apikey配置)
windows·ai编程·claude code
Zhang~Ling4 小时前
深入解析C++list:从0到1实现一个完整的链表类
c++·链表·list
Languorous.5 小时前
Windows 安装 Linux 虚拟机 / WSL 完整教程(新手零失败)
linux·运维·windows
郭龙飞9805 小时前
OpenClaw技能拓展教程 五大场景高效办公实操指南
人工智能·windows·语言模型
小鹿软件办公6 小时前
在 Windows 中什么是 iphlpsvc?禁用它安全吗?
windows·安全·iphlpsvc
诸神缄默不语6 小时前
DNS 与 hosts 文件:Windows 11 中的名称解析配置
windows·计算机网络·dns·hosts
牙牙要健康7 小时前
Windows 下为 VSCode 配置 Anaconda:从零安装 Python 环境到完整配置教程
windows·vscode·python
AI周红伟8 小时前
Token工厂:无锡部署昇腾384超节点算力集群,制造Token
大数据·人工智能·windows·百度·copilot·制造
数据法师9 小时前
微软官方外挂 PowerToys 深度解析:从架构设计到0.99新特性,重构你的Windows生产力
windows·microsoft·重构
xiaoxiang96099 小时前
AI时代的技术趋势:为什么软件正在回归CLI?
人工智能·microsoft