为什么我从错误的ArrayList中删除一个元素?

时间:2015-10-21 17:44:21

标签: java arraylist

我看到一些我无法理解的行为,并且想知道是否有人能够准确地解释这里发生了什么。这是我目前的代码。

public class MyClass {

    ArrayList<String> myList = new ArrayList<String>();

    public MyClass() {
        populate();
        removeData(myList);
    }

    private void populate() {
        myList.add("Some data");
        myList.add("Some more data");
        myList.add("Even more data");
    }

    private void removeData(ArrayList<String> list) {
        ArrayList<String> temp = new ArrayList<String>();
        temp = list;
        temp.remove("Some data");
    }
}

现在由于某种原因,在我运行此代码后,数据将从ArrayList&#34; myList&#34;中删除。为什么会发生这种情况,即使我只是从方法中的变量中删除数据&#34; removeData&#34;而不是来自现场&#34; myList&#34;?

4 个答案:

答案 0 :(得分:6)

 temp = list;

即使您要删除方法内部,仍然指向实例成员,因此它可以看到更改。

如果您不想影响实例成员,则需要使用该值创建新列表。

答案 1 :(得分:3)

将您的代码更改为:

private void removeData(ArrayList<String> list) {
    ArrayList<String> temp = new ArrayList<String>(list);
    temp.remove("Some data");
}

你会得到你想要的行为(尽管它没有多大意义)。将list分配给temp不会复制列表中的项目,而只会指定对同一内存区域的引用。

答案 2 :(得分:1)

Java使用引用,因此当您分配temp = list时,两个变量都指向同一个对象。相反,您要复制list

private void removeData(ArrayList<String> list) {
    ArrayList<String> temp = new ArrayList<String>(list); // Make a copy
    temp.remove("Some data");
}

答案 3 :(得分:1)

ArrayList<String> temp = new ArrayList<String>();
    temp = list;

在第一行中,您将创建新列表。直到这一点,它的罚款。但是在下一行中,您将list引用到temp。所以temp引用的早期对象将被垃圾收集temp将引用创建的同一对象Myclass构造函数