Java列表在更新另一个列表时发生更改

Java列表在更新另一个列表时发生更改,java,Java,假设我们有: public class Test { private List<String> mWorkList; private List<String> mOriginalList; public Test(List<String> list) { mWorkList = list; mOriginalList = list; } public void updateData(

假设我们有:

public class Test {

    private List<String> mWorkList;
    private List<String> mOriginalList;

    public Test(List<String> list) {
        mWorkList = list;
        mOriginalList = list;
    }

    public void updateData(List<String> newList) {
        mWorkList.clear();
        mWorkList.addAll(newList);
    }
}
公共类测试{
私人名单;
私人名单莫里金主义者;
公共测试(列表){
mWorkList=列表;
mOriginalList=列表;
}
公共无效更新数据(列表新建列表){
mWorkList.clear();
mWorkList.addAll(newList);
}
}
我只想更改
mWorkList
,但调用
updateData(List)
时,
mOriginalList
也会更改。
那么我应该如何保持
mOriginalList
与构造函数中最初分配的一样?

您应该在函数
Test
中创建新的
List
对象,因为您的所有列表都引用一个变量

public Test(List<String> list) {
    mWorkList = new ArrayList<>(list);
    mOriginalList = new ArrayList<>(list);
}
公共测试(列表){
mWorkList=新的ArrayList(列表);
mOriginalList=新阵列列表(列表);
}

在java中,每个变量都是一个引用,因此在这种情况下,如果更改其中一个变量,两个变量都会更改是正常的


要保留副本,必须创建新对象并克隆原始对象。

在Java中,通过变量的引用传递变量。这意味着每当您执行类似于
mWorkList=list
的赋值时,变量
mWorkList
将指向内存中当前指向的同一个位置。如果执行
mOriginalList=list
,则
mOriginalList
也将指向该位置。也就是说,所有三个列表都指向同一对象


如果需要独立列表,则需要将列表中的所有值复制到新列表中,如下所示:

List<String> myList = new ArrayList<>(otherList);

或者,如果您不想更改
mOriginalList
,也可以将其保留为
mOriginalList=list
。但请记住,如果用户对
列表
(来自您的类外)进行更改,它们也会反映在您的
mOriginalList
中,这很容易导致严重错误

每当您将一个对象分配给另一个对象时,只有引用被分配(浅拷贝)。您应该调用复制构造函数来进行深度复制

public class Test {

    private List<String> mWorkList;
    private List<String> mOriginalList;


    public Test(List<String> list) {
        mWorkList = new ArrayList<>(list);
        mOriginalList = new ArrayList<>(list);
    }

    public void updateData(List<String> newList) {
        mWorkList.clear();
        mWorkList.addAll(newList);
    }
}                  
公共类测试{
私人名单;
私人名单莫里金主义者;
公共测试(列表){
mWorkList=新的ArrayList(列表);
mOriginalList=新阵列列表(列表);
}
公共无效更新数据(列表新建列表){
mWorkList.clear();
mWorkList.addAll(newList);
}
}                  

您正在使用同一实例引用设置两个列表

mWorkList = list;
mOriginalList = list;
您需要通过复制列表为
mOriginalList
创建一个新实例。这可以通过的构造函数之一完成

mOriginalList=newarraylist(列表);

请注意,这两个列表中的实例是相同的,因此如果在
列表中更新实例,它将在
mOriginalList
中更改。如果您也想断开该链接,则需要克隆列表及其内容。

两者都指向同一个
列表实例。。。您需要创建一个新的
列表实例
,请参见如何将列表复制到一个新实例详细说明:如上所述,对列表有不同的引用。然后使用mWorkList.addAll(list);mOriginalList.addAll()来填充lists@YegorBabarykinOP必须等待至少15分钟才能接受。这确保了其他人也有机会发布好的答案()。@Zabuza谢谢,我不知道这个规则
mWorkList = list;
mOriginalList = list;
mOriginalList = new ArrayList<>(list);