我有2D ArrayList.将ArrayList包含10 ArrayList秒.我尝试了以下代码:
这是主要的2D ArrayList.在主要内部ArrayList有10 ArrayList秒:
ArrayList<ArrayList<Items>> arrayList = new ArrayList<ArrayList<Items>>();
Run Code Online (Sandbox Code Playgroud)
在这里,我尝试创建其中一个的副本ArrayList(selectedRow只是一个数字,表示ArrayList我得到的)
ArrayList<Items> newList = new ArrayList<Items>(arrayList.get(selectedRow));
Run Code Online (Sandbox Code Playgroud)
之后我创建另一个ArrayList:
ArrayList<Items> changeList = new ArrayList<Items>(it.returnTheNewArrayList(newList,randomItem));
Run Code Online (Sandbox Code Playgroud)
然后在另一个类中我创建了这个方法.此方法的目的是更改其中一个对象的属性.
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;
}
Run Code Online (Sandbox Code Playgroud)
最后,我在2D ArrayList中设置了新的ArrayList
arrayList.set(whichList, changeList);
Run Code Online (Sandbox Code Playgroud)
这是程序.我发现,当我运行这个程序,无论是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;
}
Run Code Online (Sandbox Code Playgroud)
同样,值a只是对列表的引用 ...所以当你返回相同的引用时,你根本就不会返回一个新 ArrayList的.
您真的需要了解引用和对象在Java中的工作方式 - 使用该语言绝对至关重要.
| 归档时间: |
|
| 查看次数: |
470 次 |
| 最近记录: |