最终的静态arraylist在函数中发生了变化

时间:2017-06-18 13:46:48

标签: java arraylist

我定义了静态final ArrayList,然后我将它发送给其他要更改的类。但是由于他是最终的,所以它应该只在第二类中本地更改,就像我的例子中的int。为什么Main类也改变了?

小代码示例:

public class Main {

    private static final ArrayList<String> myList = new ArrayList<>(Arrays.asList("One", "Two"));
    private static final int num = 5;

    public static void main(String[] args) {

        SecondClass second = new SecondClass(myList,num);
        System.out.println("List in Main: "+myList.get(0));
        System.out.println("Num in Main: "+num);
    }
}

public class SecondClass {

    public SecondClass(ArrayList<String> list, int num)
    {
       list.set(0,"Three");
       num = 10;

        System.out.println("List in second: "+list.get(0));
       System.out.println("Num in Second: "+num);
    }
}

我的输出:

List in second: Three
Num in Second: 10
List in Main: Three
Num in Main: 5

我的预期是:

List in second: Three
Num in Second: 10
List in Main: One
Num in Main: 5

2 个答案:

答案 0 :(得分:3)

myList是不可变的;它指向的对象不是。如果您希望列表的内容不可变,请使用Collections.unmodifiableList()(或类似Guava的ImmutableList)。

(在方法签名中使用ArrayList是一种不好的形式。如果你有真的有充分的理由需要,请使用ListRandomAccessList行为[你没有]。)

答案 1 :(得分:1)

final关键字可以防止为myList变量分配另一个值,但它不会阻止更改列表实例本身。

您需要的是无法修改的列表。所以你可以使用一个不可修改的列表:

private static final ArrayList<String> myList =     
        Collections.unmodifiableList(Arrays.asList("One", "Two"));