当前位置: 首页 > 知识库问答 >
问题:

ArrayList作为函数的参数,但未能传递出去?

饶德元
2023-03-14

我编写了一个函数来处理一些ArrayList,并希望将列表传递给外部调用者。但我发现调用函数后列表没有更改。

@Test
public void testList() {
    List<Integer> l1 = new ArrayList<Integer>(5);
    List<Integer> l2 = new ArrayList<Integer>(5);
    l1.add(11); l1.add(12); l1.add(13); l1.add(14); l1.add(15);
    l2.add(21); l2.add(22); l2.add(23); l2.add(24); l2.add(25);
    System.out.println("outer l1: " + l1);
    System.out.println("outer l2: " + l2);

    subList(l1, l2);  //call the function

    System.out.println("after l1: " + l1);
    System.out.println("after l2: " + l2);
}

protected static void subList(List<Integer> l1, List<Integer> l2) {
    l1.remove(0);  l1.remove(0);
    l2 = l2.subList(0, 4);
    System.out.println("inner l1: " + l1);
    System.out.println("inner l2: " + l2);
}
outer l1: [11, 12, 13, 14, 15]
outer l2: [21, 22, 23, 24, 25]
inner l1: [13, 14, 15]             (in function, changed)
inner l2: [21, 22, 23, 24]         (in function, changed too)
after l1: [13, 14, 15]             (changed)
after l2: [21, 22, 23, 24, 25]     (unchanged?!)

列表参数是否由CopyValue传递??那么,在函数中,当L2的引用发生变化时,JVM复制一个新的列表,原来的外部列表是否保持旧值?

如何编写修改ArrayList的“副作用”过程?

共有1个答案

劳烨
2023-03-14

在Java中,引用总是通过值传递的。因此,将新值赋给被调用方法中的L2不会更改调用方法中的引用。

您需要以下代码才能使其工作:

List<Integer> subList = new ArrayList<Integer>(l2.subList(0, 4));
l2.clear();
l2.addAll(subList);
 类似资料:
  • 我有两个功能。一个是,它以Int x和函数p作为参数,并返回布尔结果p(x)。就这么简单。 然后我有第二个函数,它就像 在调用时,有没有办法更改,使其像?(如果f返回true,则将其设为false) 比如: 我知道我可以通过masterChecker调用,但我想知道的是,是否可以更改作为参数传递的函数行为。

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子:

  • 问题内容: 在Java中,我可以做类似的事情 然后稍后在方法中“运行”代码。处理(匿名内部类)很痛苦,但是可以做到。 Go是否有可以促进函数/回调作为参数传递的内容? 问题答案: 是的,请考虑以下示例: 播放:http://play.golang.org/p/XNMtrDUDS0 导览:https : //tour.golang.org/moretypes/25(函数闭包)

  • 问题内容: 我已经熟悉Android框架和Java,并希望创建一个通用的“ NetworkHelper”类,该类可以处理大多数联网代码,使我能够从中调用网页。 我遵循了来自developer.android.com的这篇文章来创建我的网络类:http : //developer.android.com/training/basics/network- ops/connecting.html 码:

  • 问题内容: 我正在读一本教科书,我想知道我们传递给函数的参数为​​什么既不是原始的也不是用户定义的类实例。 我知道它是这两个之一。但是似乎在这里它传递了用户定义的构造方法,例如Runnable()。看来他们想在以后运行线程,但是什么时候?我认为这是合法的,但是我在Java类中从未听说过这种事情。 问题答案: 实际上,这是传递实现Runnable接口的匿名内部类的实例。在Java教程中阅读有关它们的

  • 我有一个函数,它有两个参数,最后一个参数是回调闭包: 我想让第二个回调闭包参数可选。我试图将上面的函数重新定义为: 我收到编译器错误: nil默认参数值不能转换为类型'