【发布时间】:2019-01-24 21:31:05
【问题描述】:
在下面的代码中,我将列表(在 main 中定义)传递给 remove_dup 方法,它更新了实际的数组列表(列表)。由于 Java 是按值传递的,那么为什么列表由 remove_dup 方法更新。
然后我使用 list 创建了另一个 list2,但是如果我在 list2 中添加一个元素,它不会被添加到列表中。
为什么要更新主列表而其他方法不更新?
public class ArrayListTest {
public static void remove_dups(ArrayList<String> list, int n) {
Set<String> unqList = new TreeSet<String>(list);
list.clear();
list.addAll(unqList);
}
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("two");
remove_dups(list);
//As Java is pass by value then why its printing unique values here?
//expected output---- One two two but its printing one two
for (String string : list) {
System.out.println(string);
}
ArrayList<String> list2 = new ArrayList<String>(list);
list2.add("three");
for (String string : list2) {
System.out.println("list 2-" + string);
}
//I was expecting "three to be printed with list"
for (String string : list) {
System.out.println("list 1-" + string);
}
}
}
【问题讨论】:
-
我无法重现您的问题;当测试 list2 按预期包含“三个”时。由于变量 n 未定义,您的代码将无法编译。
-
你认为
new ArrayList<String>(list);会做什么? -
您是否期望第一个列表也包含“三个”?
-
当您将
list传递给remove_dups时,您传递的是对原始对象的引用,这允许remove_dups修改内容。当调用new ArrayList<String>(list)时,它会用list的内容创建一个新的List,但是修改list2不会改变list,因为两者之间不再有联系,它们是两个不同的实例List -
”Java 总是按值传递。不幸的是,当我们传递一个对象的值时,我们传递的是对它的引用。这让初学者感到困惑。” 欢迎来到一个混乱的世界????