Java不可修改的数组

final Integer[] arr={1,2,3}; arr[0]=3; System.out.println(Arrays.toString(arr)); 

我尝试了上面的代码,看看是否可以重新分配最终数组的变量[ ans :它可以]。我理解通过最终的Integer []数组,这意味着我们不能分配另一个Integer []的实例,而不是我们拥有的那个最初分配。我想知道是否有可能使数组变量也不可修改。

据我所知,这是不可能的。

然而,存在一种方法Collections.unmodifiableList(…) ,其创建例如List的不可修改的视图。

如果您想保证即使不可修改的视图列表的创建者也无法修改底层(可修改的)列表,请查看Guava的ImmutableList 。

不可以。可以更改arrays的内容。 你不能阻止这一点。

集合有各种创建不可修改集合的方法,但没有提供数组。

final关键字只能阻止更改arr引用,即你不能这样做:

 final int[] arr={1,2,3}; arr = new int[5]; 

如果对象arr引用的是可变对象(如数组),则没有什么可以阻止您修改它。

唯一的解决方案是使用不可变对象。

关键字“final”仅适用于引用(指向堆中对象的内存位置的指针)。 您无法更改对象的内存地址(位置)。 它是如何在内部处理不变性的。

补充说,虽然int是原始数据类型int []应该被视为一个对象。

你不能这样做

 final int a = 5 a = 6 

你可以这样做:

 final int[] a = new int[]{2,3,4}; a[0] = 6; 

你不能这样做:

 final int[] a = new int[]{2,3,4}; a = new int[]{1,2,3} 

对于阅读这个旧问题的其他人,请记住还有Google Guava的不可变集合。 ImmutableList比Collections.unmodifiableList()具有更强大的性能,并且可以说更安全,因为它确实是不可变的,并且没有可变集合的支持。

另一种方法是使用此function:

 Arrays.copyOf(arr, arr.length);