为什么我能够在超出范围的方法中修改List而不返回它?

时间:2016-04-03 22:41:26

标签: java

让我说我像这样初始化我的列表:

public static void main(String[] args) {
    ArrayList<String> a = new ArrayList<String>();
    a.add("one");
    a.add("two");
    a.add("three");
    a.add("four");
    modifyList(a);
}

其中modifyList只是将每个值更改为&#34;一个&#34;像这样:

private static void modifyList(ArrayList<String> a) {
    for (int i = 0; i < a.size(); i++) {
        a.set(i, "one");
    }
}

如果我在调用此方法之前和之后打印列表,我希望相同的原始列表出现两次。但由于某种原因,在modifyList中修改的ArrayList与main中的ArrayList相同。

如果我尝试使用整数和字符串而不是列表进行相同的实验,他们会进行修改。

任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分:4)

在Java中,参数按值传递。

但是,您将对ArrayList的引用传递给方法(并且引用本身按值传递),因此该方法修改了原始列表。

如果要确保不会发生这种情况,则需要传递一个不可变列表作为参数。