Java 函数中的最终静态arraylist已更改

Java 函数中的最终静态arraylist已更改,java,arraylist,Java,Arraylist,我定义了静态最终ArrayList,然后将其发送到其他类进行更改。但是它应该只在第二个类中局部改变,因为他是最终的,就像我的例子中的int。为什么它在主课堂上也发生了变化 小代码示例: public class Main { private static final ArrayList<String> myList = new ArrayList<>(Arrays.asList("One", "Two")); private static final i

我定义了静态最终ArrayList,然后将其发送到其他类进行更改。但是它应该只在第二个类中局部改变,因为他是最终的,就像我的例子中的int。为什么它在主课堂上也发生了变化

小代码示例:

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: One
Num in Main: 5

myList
是不可变的;它指向的对象不是。如果希望列表的内容不可变,请使用集合.unmodifiableList()(或类似于番石榴的
不可变列表


(在方法签名中使用
ArrayList
是一种不好的形式。只要使用
List
,或者
RandomAccessList
,如果你有很好的理由需要这种行为[你没有]。

myList
是不可变的;它指向的对象不是。如果希望列表的内容不可变,请使用集合.unmodifiableList()(或类似于番石榴的
不可变列表


(在方法签名中使用
ArrayList
是一种不好的形式。只要使用
List
,或者
RandomAccessList
,如果你有很好的理由需要这种行为[你不需要]。

final
关键字可以防止
myList
变量被赋予另一个值,但它并不阻止对列表实例本身的更改

您需要的是一个不能修改的列表。因此,您可以使用不可修改的列表:

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

关键字
final
可防止
myList
变量被赋予另一个值,但它不会阻止对列表实例本身的更改

您需要的是一个不能修改的列表。因此,您可以使用不可修改的列表:

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

Num in Second
是绑定到参数引用的局部变量,而不是由另一个类设置的静态变量。另一方面,列表是一个对象引用,因此same是一个练习,try
SecondClass(ArrayList list,final Integer num)
num in Second
是一个绑定到参数引用的局部变量,而不是另一个类设置的静态变量。另一方面,列表是一个对象引用,因此same是一个练习,请尝试
SecondClass(ArrayList list,final Integer num)