我正在用java列表做一些实验。我已将list参数传递给一个简单的方法,该方法将两个字符串添加到一个新列表中。在最后,我已经为方法列表分配了在方法中创建的列表。
我原本期望得到以下结果:
[a, b]
但我得到了[c, d]
我有这段代码:
public class A {
public static void f(List<String> list){
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("b");
list = list2;
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("c");
list.add("d");
f(list);
System.out.println(list);
}
}
任何人都可以解释我在后台发生了什么吗?
答案 0 :(得分:0)
你没有在你的主()中调用f(列表) 即使你打电话,你也会得到[c,d] 因为你没有改变传递的列表。 您只是在f()
中更改本地列表引用答案 1 :(得分:0)
Java分配方法参数&#39;按值&#39; (反对&#39;通过引用&#39;和#39;通过指针&#39;)。
致电时
void f(List<String> list)
您将指针传递给列表。指向列表的指针是复制到另一个变量和赋值
list = list2
分配&#39; list2&#39;到指针的单独副本。意味着通过这个赋值原始指针保持不变。
答案 2 :(得分:0)
在你的主要功能中:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("c");
list.add("d");
System.out.println(list);
}
您已创建列表并向该列表添加了两个元素。而且你只是简单地打印了这个列表,这就是为什么你总是得到[c,d]作为输出。你从未调用你的函数f()。
现在你的函数f():
public static void f(List<String> list){
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("b");
list = list2;
}
它希望引用列表作为参数。
第1步:List<String> list2 = new ArrayList<>();
创建一个新列表。
比在这个新列表中添加两个元素。
然后在步骤list = list2;
中,您只是更改列表的引用,现在它指向list2。但是你无法操纵main方法中创建的列表。因此,即使您从main方法调用函数f(list)
,也不会在main方法中将更改反映到您的列表中。