【问题标题】:Java pass by reference issue with List [duplicate]列表的Java按引用传递问题[重复]
【发布时间】:2015-07-19 01:15:13
【问题描述】:

我正在创建 ArrayList l1 并将 l1 引用传递给方法 foo。 正如我们所知,Java 不支持 Pass-By-Reference,但在这里它给出了不同的结果。

看下面的代码

public static void main(String[] args) {
    List l1 = new ArrayList(Arrays.asList(4,6,7,8));
    System.out.println("Printing list before method calling:"+ l1);
    foo(l1);
    System.out.println("Printing list after method calling:"+l1);
}

public static void foo(List l2) {
    l2.add("done"); // adding elements to l2 not l1
    l2.add("blah");
}

输出:

Printing list before method calling:[4, 6, 7, 8]
Printing list after method calling:[4, 6, 7, 8, done, blah]

【问题讨论】:

  • 你的问题是什么?
  • 我在 foo 方法中将元素添加到 l2 之后,我在 Main 方法中打印 l1。无论我添加到 l2 中的什么都能够在 l1 中检索。我想知道它在编译器中是如何工作的。这是传递引用。
  • 实际上,您可以将原语视为按值传递,将对象视为按引用传递。
  • @SteveChaloner:不,我会说这是一个非常糟糕的主意。它鼓励各种不正确的心理建模 - 如果他们后来使用具有 real 传递引用的语言,肯定会使 OP 感到困惑。所需要的只是理解l1 的值是一个引用,而不是一个对象,并且你根本不需要改变“通过引用传递”的含义。

标签: java list pass-by-reference


【解决方案1】:

我们知道 Java 不支持 Pass-By-Reference,但在这里它给出了不同的结果。

显然您听说 Java 只支持按值传递。这确实是正确的。但是你还必须意识到,Java 有引用,而且这些引用可以按值传递。

在这种情况下,对列表的引用传递给方法(尽管引用是按值传递的)。

然后该方法使用此引用来修改原始列表,这就是为什么您也会在“外部”看到更改的原因。

Is Java "pass-by-reference" or "pass-by-value"?

【讨论】:

  • 另外,这仅适用于非原始类型和非不可变对象,如String 类。
  • 没有。相同的规则适用于所有类型的变量。
  • 但是,例如,您将无法在作为参数给出的方法中更改 int 的值,就像他在他的示例中更改 List 一样,还是我错了?
  • ...就像您也无法更改 l1 中包含的引用一样。您必须记住,l1 包含引用,而不是列表。
猜你喜欢
  • 1970-01-01
  • 2013-12-02
  • 2012-03-12
  • 2013-09-15
  • 2015-12-08
  • 2016-01-27
  • 1970-01-01
  • 2012-03-13
  • 2014-09-10
相关资源
最近更新 更多