Java - 从旧列表创建新列表,旧列表也被修改

标签 java arraylist collections

<分区>

我使用 addAll() 方法从旧列表创建了新列表,当我尝试修改新列表时,旧列表也被修改了。

例如-

List<A> list = new ArrayList<A>();
        list.add(new A("something1"));
        list.add(new A("something2"));
        list.add(new A("something3"));
        list.add(new A("something4"));
        List<A> newList = new ArrayList<A>();
        newList.addAll(list);
        for(A a1 : newList){
            a1.setA("something new");
        }

        System.out.println("list----------------");
        for(A a1 : list){
            System.out.println(a1.toString());
        }
        System.out.println("new list----------------");
        for(A a1 : newList){
            System.out.println(a1.toString());
        }

输出-

  list----------------
A [a=something new]
A [a=something new]
A [a=something new]
A [a=something new]
new list----------------
A [a=something new]
A [a=something new]
A [a=something new]
A [a=something new]

如何防止这种行为并保持旧列表不变?

最佳答案

(您的代码的第一个版本有一个拼写错误。我假设您的真实代码中不存在这个错误。)

真正的问题是您将对相同对象的引用放入两个单独的列表中。当您调用 set 方法时,这是在修改对象……而不是列表。当然,您可以通过任一列表查看对对象的修改。

如果您不希望发生这种情况,则必须将第一个列表中的对象副本 添加到第二个列表中。为此,您需要实现一种复制 A 实例的方法。您可以使用:

  • 一个拷贝构造函数,
  • 复制或克隆方法,
  • 序列化和反序列化,或者
  • 临时代码。

一旦您找到了复制A 的方法,您只需迭代第一个列表,将其条目的副本 添加到第二个列表。

关于Java - 从旧列表创建新列表,旧列表也被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52855840/

相关文章:

java - Eclipse 禁用 "Run in Background"

java - 来自不同类的对象的 ArrayList - 空指针错误

java - 通过在 ArrayList 中以逗号分割来存储字符串

java - 在java中展平一个嵌套的N级嵌套对象

c# - 这是在多线程方法中安全使用 Dictionary 吗?

java - 使用 Hibernate 作为库

java - Apache MetaModel - 查询电子表格性能不佳

java - android java 检索数组列表中的共享首选项

list - Dart语言: Creating and accessing dynamic Lists

java - 数组转换 Java 8 与 Java 9