将创建为java方法的列表分配给作为参数传递的列表

时间:2018-06-04 18:33:10

标签: java

我正在用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);
  }
}

任何人都可以解释我在后台发生了什么吗?

3 个答案:

答案 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方法中将更改反映到您的列表中。