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);