Java不可修改的数组

时间:2010-09-17 18:01:19

标签: java arrays unmodifiable

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

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

6 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:9)

没有。可以更改数组的内容。你不能阻止它。

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

答案 2 :(得分:4)

final关键字仅阻止更改arr引用,即您无法执行:

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

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

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

答案 3 :(得分:1)

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

rec[1]

答案 4 :(得分: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}

答案 5 :(得分:0)

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