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);
相关推荐
大强同学28 分钟前
CloudFlare-ImgBed+HuggingFace图床搭建教程
windows·github·图床搭建
C++ 老炮儿的技术栈1 小时前
Qt中自定义 QmyBattery 电池组件开发
c语言·开发语言·c++·windows·qt·idea·visual studio
驰羽1 小时前
如何给Windows添加右键菜单选项
windows
石像鬼₧魂石1 小时前
Windows 7 + Windows Server 2008 域环境渗透实战完整教程(详细版・教学专用)
windows
野生工程师2 小时前
【Linux基础-2】Linux的基本指令
linux·运维·windows
玉梅小洋2 小时前
C盘爆满 修改VS Code缓存与插件目录指定方法
开发语言·windows·visualstudio
dvlinker2 小时前
使用 Bright Data 插件扩展 Microsoft TaskWeaver,实现网页数据高效获取
microsoft·taskweaver
billy_gisboy2 小时前
02-Windows DockerDesktop部署ClickHouse,解决指定磁盘数据持久化问题与WSL2调优
windows·clickhouse
薛定谔的猫喵喵2 小时前
【从零构建】PHP网络安全渗透测试靶场:5大基础漏洞实战
windows·sql·web安全·php
卡兰芙的微笑2 小时前
GDB调试指南:从入门到精通
windows