final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));
我尝试了上面的代码,看看是否可以重新分配最终数组的变量[ ans :它可以]。我理解通过最终的Integer []数组,这意味着我们无法分配另一个实例Integer []除了我们最初指定的那个之外。我想知道是否有可能使数组变量也不可修改。
答案 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()具有更强大的性能,并且可以说更安全,因为它确实是不可变的,并且没有可变集合的支持。