我看到一些我无法理解的行为,并且想知道是否有人能够准确地解释这里发生了什么。这是我目前的代码。
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;?
答案 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
构造函数