我有一个 2D ArrayList
。 ArrayList
包含 10 个 ArrayList
。我尝试了以下代码:
这是主要的 2D ArrayList
。在主ArrayList
内部有10个ArrayList
:
ArrayList<ArrayList<Items>> arrayList = new ArrayList<ArrayList<Items>>();
在这里,我尝试创建其中一个 ArrayList
的副本(selectedRow
只是一个数字,表示我得到的是哪个 ArrayList
)
ArrayList<Items> newList = new ArrayList<Items>(arrayList.get(selectedRow));
之后我创建另一个ArrayList
:
ArrayList<Items> changeList = new ArrayList<Items>(it.returnTheNewArrayList(newList,randomItem));
然后在另一个类中我创建了这个方法。此方法的目的是更改其中一个对象的属性。
public ArrayList<Items> returnTheNewArrayList(ArrayList<Items> a,int item){
int randomBin = r.nextInt(50);
for(Items i:a){
if(item==i.itemIds()){
while(randomBin==i.bins()){
randomBin = r.nextInt(50);
}
i.setBin(randomBin);
}
}
return a;
}
最后,我在 2D ArrayList 中设置了新的 ArrayList
arrayList.set(whichList, changeList);
这是程序。我发现,当我运行此过程时,newList
和 changeList
是相同的。在这两个 ArrayLists 中,我都保存了在方法 returnTheNewArrayList 中所做的更改(我通过调试发现了这一点)。但我只想更改一个(changeList
)。
我做错了什么?
最佳答案
列表包含对对象的引用。当您调用 i.setBin(...)
时,(大概)会对对象本身进行更改。
每个列表都有一个独立的引用副本 - 因此您可以从一个列表中删除一个元素而不影响另一个列表 - 但它们只是引用。
想象一下,您给了两个人剪贴板,上面有相同的家庭地址列表。一个人去把剪贴板上的每栋房子的前门都涂成红色,然后第二个人参观了所有相同的房子。第二个人会看到红色的门,不是吗?这里也是一样的。 列表包含引用,而不是对象。
如果您希望列表完全独立,则需要使用对不同对象的引用来填充它们。
编辑:我刚刚注意到您还需要更改您的returnTheNewArrayList
方法,该方法实际上甚至没有创建一个新的ArrayList
首先!
public ArrayList<Items> returnTheNewArrayList(ArrayList<Items> a,int item) {
// Stuff which doesn't change the value of a...
return a;
}
同样,a
的值只是列表的引用...因此,当您返回相同的引用时,您不会返回 >新的ArrayList
根本。
您确实需要了解引用和对象在 Java 中的工作原理 - 这对于使用该语言绝对至关重要。
关于java - java中的二维数组列表(为什么集合最终相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9403790/