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

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

4

6 回答 6

27

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

然而,有一个方法Collections.unmodifiableList(..)可以创建一个不可修改的视图,例如List<Integer>.

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

于 2010-09-17T18:05:17.880 回答
9

No. The contents of an array can be changed. You can't prevent that.

Collections has various methods for creating unmodifiable collections, but arrays aren't provided for.

于 2010-09-17T18:05:22.833 回答
5

final 关键字仅防止更改 arr 引用,即您不能这样做:

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

如果 arr 所指的对象是可变对象(如数组),则没有什么能阻止您对其进行修改。

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

于 2010-09-17T18:15:38.043 回答
2

另一种方法是使用此功能:

Arrays.copyOf(arr, arr.length);
于 2017-08-31T12:43:19.627 回答
0

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

于 2015-04-15T12:49:12.503 回答
0

关键字“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}
于 2011-03-03T22:49:50.643 回答