为arraylist调用remove(int)方法会从所有类似的arraylists中删除该项

时间:2013-11-19 05:24:43

标签: java android arraylist

好吧,我不是专业的程序员,所以我的问题可能听起来很傻。

我有这段代码:

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中,而不必逐个添加所有项目?

7 个答案:

答案 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

相关问题