强调文字如何更改,清除或删除其他列表引用?例如,我有两个名为listA和ListB的列表,而ListA有3个项目。现在,我将所有项目listA添加到listB之后,更改了listB中的任何项目。它也已在listA中更改。但我不想更改listA。
I'm trying in android studio language is JAVA.
List<StringModel> listA=new List<>();
listA.add("One");
listA.add("Two");
listA.add("Three");
List<StringModel> listB=new List<>();
listB.addAll(listA);
listB.get(0).set("1");
现在listB已更改,listA也已更改。但我不想更改listA原始列表。这样清除和删除功能也可以正常工作。
搜索后,对于重复列表,引用不明确。
Adding one list to another list in java?
我希望输出处理不同引用中的两个列表。
答案 0 :(得分:1)
首先,我认为您在这种情况下是指ArrayList:
ArrayList<String> listA=new ArrayList<String>();
listA.add("One");
listA.add("Two");
listA.add("Three");
ArrayList<String> listB=new ArrayList<String>();
listB.addAll(listA);
这是有效的代码。如果我们使用String类,则由于字符串是不可变的,因此无法从列表中更改元素,唯一的选择是从列表中删除它或添加另一个。
我想你要问的是,如果我们创建了ArrayList<ClassA>
,为什么状态是可变的?
答案来自变量如何与类交互。例如,假设您要创建一个ClassA的新对象:
class ClassA {
int x = 5;
}
ClassA foo = new ClassA()
在这种情况下,foo包含对在内存中分配的对象ClassA的引用,那么我们可以执行以下操作:
ClassA bar = foo
bar.x = 10
如果打印foo.x,您将发现该值为10,因为您指向内存中的同一对象。现在,当您将元素添加到ArrayList时,您应该了解到,您正在添加对对象的引用,而不是实际值,并且当您更改listB中指向与listA中相同对象的fieldB的值时,它当然也会更改值。
解决问题的方法是确保使用不可变的对象,或者使用一个复制构造函数来生成一个与原始对象具有相同值的新对象。