final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));
我尝试了上面的代码来查看是否可以重新分配最终数组的变量[ ans :it can be]。我理解最终的 Integer[] 数组意味着我们不能分配 Integer[] 的另一个实例,除了我们拥有的那个最初分配。我想知道是否可以使数组变量也不可修改。
final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));
我尝试了上面的代码来查看是否可以重新分配最终数组的变量[ ans :it can be]。我理解最终的 Integer[] 数组意味着我们不能分配 Integer[] 的另一个实例,除了我们拥有的那个最初分配。我想知道是否可以使数组变量也不可修改。
据我所知,这是不可能的。
然而,有一个方法Collections.unmodifiableList(..)可以创建一个不可修改的视图,例如List<Integer>
.
如果您想保证即使是不可修改视图列表的创建者也不能修改底层(可修改)列表,请查看Guava 的 ImmutableList。
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.
final 关键字仅防止更改 arr 引用,即您不能这样做:
final int[] arr={1,2,3};
arr = new int[5];
如果 arr 所指的对象是可变对象(如数组),则没有什么能阻止您对其进行修改。
唯一的解决方案是使用不可变对象。
另一种方法是使用此功能:
Arrays.copyOf(arr, arr.length);
对于其他阅读这个老问题的人,请记住还有 Google Guava 的不可变集合。ImmutableList 比 Collections.unmodifiableList() 具有更强的性能,并且可以说更安全,因为它确实是不可变的,并且不受可变集合的支持。
关键字“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}