java - ArrayList作为函数的参数,却未能传递出去?

标签 java arraylist

我编写了一个函数来处理一些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?!)

看起来 List2 没有被函数 subList(List l1, List l2) 改变,而 List1 改变了。

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

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

最佳答案

在 Java 中引用始终按值传递。因此,在被调用方法中为 l2 分配新值不会更改调用方法中的引用。

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

List<Integer> subList = new ArrayList<Integer>(l2.subList(0, 4));
l2.clear();
l2.addAll(subList);

关于java - ArrayList作为函数的参数,却未能传递出去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12476613/

相关文章:

java - 如何简化相似的构造函数?

java - Instanceof 和 Casting,多态性

Java:返回 ArrayList 还是直接在方法中更新是更好的做法

java - 如何允许用户更改ArrayList中的值?

java - 遍历 Java 中声明的枚举

java - 关于选中复选框的显示面板

java - 无法从单选按钮正确地将值添加到 ArrayList - Java GUI

C#排列数组列表?

java - 有没有办法在 ImageView 中找到图像可见部分的大小?

java - java中如何将2Darray转换为2D ArrayList?