我有这段代码:
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1 = list2;
请注意list2
[1, 2, 4]
内有三个项目。所以现在list1
里面有相同的项目。
但是当我调用remove(index)
方法时。它会从两者 ArrayLists中删除该项目。
这是我的完整代码:
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1 = list2;
for (int i = 0; i < list1.size(); i++) {
if (list1.get(i) == practiceId) {
list1.remove(i);
}
}
我这样做的目的是解决一个有其他解决方案的问题。我问这个问题只是因为我很好奇并且想知道为什么会这样?如何在不从两个ArrayLists中删除的情况下删除项目?
另外,我有一些想法为什么会这样。当我尝试逐步调试代码时,它显示两个ArrayLists具有相同的id
。所以我认为这可能是问题的原因。如果这是真的,那么有没有办法制作一个新的ArrayList并将所有项目放在新的ArrayList中,而不必逐个添加所有项目?
答案 0 :(得分:2)
因此,当你将这两个列表设置为彼此相等时,我不认为你正在做你认为你在做的事情。听起来很有趣。当你这样做时,你实际上将list1的内存地址设置为与list2相同。现在,当你删除它们时它们都指向内存中的相同位置将从两个列表中删除。
有意义吗?
答案 1 :(得分:1)
这是因为ArrayList存储了对象并且你说list1 = list2它们的引用设置相同,你需要做的是创建另一个名为list2的ArrayList,这样它们的值却不是它们的引用是一样的,你可以做这个。
list2.equals(list1);
答案 2 :(得分:1)
当你正在进行list1 = list2
时,它最终使两个对象都相同。并且在尝试从一个对象中删除项目时,从两个对象中删除这两个对象具有相同的实例值。
如果你想复制你可以做的项目如下。
ArrayList list1 = new ArrayList();
for (int i = 0; i < list2.size(); i++) {
list1.add(list2.get(i));
}
上面的代码会将列表项从list2复制到list1,现在将是不同的对象。 现在,您可以在一个列表上执行操作,它不会影响另一个列表
答案 3 :(得分:0)
不要使用list = list 2来复制arraylists的内容。它只是添加了对原始arraylist的引用。要复制arraylist的内容,请使用:
list1.addAll(list2);
答案 4 :(得分:0)
几乎所有提到的答案都很有帮助。
但正如我之前提到的,我不想逐个添加元素。有一个答案是:
ArrayList<Integer> list1 = new ArrayList<Integer>(list2);
不幸的是海报删除了。无论如何,这正是我正在寻找的。干净,一行,不需要额外的方法或循环或任何东西。
感谢您的回答:)
答案 5 :(得分:0)
我希望你有这个帮助
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();//added 1, 2, 4
list1 = (ArrayList<Integer>) list2.clone();
答案 6 :(得分:0)
执行list2 = list1
时,相同的引用将被复制到第二个列表中,因此无论您在一个列表中执行哪些更改,其他列表中都会发生相同的更改。要成功执行此操作,您应该使用: -
list2.addAll(1);
现在,如果您要从list2中删除,则只会从list2中删除项目而不会删除list1