Java改变了最终数组元素的值

big*_*ata 3 java arrays

我试图理解如果我将值重新分配给最终的数组元素会发生什么,这是代码:

public class XYZ {
    private static final String[] ABC = {"Hello"};

    public static void main(String[] args){
        System.out.println(ABC[0]);

        ABC[0] = " World!!!";
        System.out.println(ABC[0]);

    }
}
Run Code Online (Sandbox Code Playgroud)

ABC是最终数组,并且在最初的位置它"Hello"最初有,但是当我重新分配它时," World!!!"它应该超过之前的值,或者它应该给出重新分配到最终变量的编译错误.这个程序运行正常,这是输出:

run:
Hello
 World!!!
BUILD SUCCESSFUL (total time: 0 seconds)
Run Code Online (Sandbox Code Playgroud)

Dic*_*ici 10

final关键字并不意味着你不能改变对象的状态,但只有标记为基准final将保持不变.例如,你将无法做到这样的事情

final String[] ABC = {"Hello"};
ABC = new String[3]; // illegal
ABC = someOtherArray; // illegal;
ABC[0] = "World"; // legal
Run Code Online (Sandbox Code Playgroud)


rge*_*man 5

何时final应用于变量,这仅表示初始化后无法重新分配.这并不妨碍对象本身的修改.在这种情况下,您正在修改数组对象.所以这很好:

ABC[0] = " World!!!";
Run Code Online (Sandbox Code Playgroud)

但这不是允许的.

ABC = new String[]{" World!!!"};
Run Code Online (Sandbox Code Playgroud)


Kum*_*nav 5

Arrays是可变对象,除非创建时大小为 0。因此,您可以更改数组的内容。final只允许您防止将引用更改为另一个数组对象。

final String[] ABC ={"Hello"};
ABC[0]="Hi" //legal as the ABC variable still points to the same array in the heap
ABC = new String[]{"King","Queen","Prince"}; // illegal,as it would refer to another heap Object
Run Code Online (Sandbox Code Playgroud)

我建议您使用Collections.unmodifiableList(list)创建一个不可变列表。请参阅此处的 javadoc (unmodifibale 列表)。

您可以执行以下操作

String[] ABC = {"Hello"};
List<String> listUnModifiable = Collections.unmodifiableList(java.util.Arrays.asList(ABC));
Run Code Online (Sandbox Code Playgroud)

在任何时候,您都可以通过调用获取数组 listUnModifiable.toArray();