Java 修改不可变数组不工作
修改了使数组不可变的代码,但在某些地方出错了。在代码中,当为ImmutableClassWithArray创建对象时,列表将使用给定数组初始化。在getter内部,将返回不可修改的列表,并将其转换为数组。然后修改数组。即使在调用构造函数后数组被更改,也意味着在列表已经用一些值初始化之后,最终数组仍然会用更新后的值反映出来Java 修改不可变数组不工作,java,arrays,immutability,Java,Arrays,Immutability,修改了使数组不可变的代码,但在某些地方出错了。在代码中,当为ImmutableClassWithArray创建对象时,列表将使用给定数组初始化。在getter内部,将返回不可修改的列表,并将其转换为数组。然后修改数组。即使在调用构造函数后数组被更改,也意味着在列表已经用一些值初始化之后,最终数组仍然会用更新后的值反映出来 public final class ImmutableClassWithArray { private final Integer[] arr= {1,2,3,4}
public final class ImmutableClassWithArray {
private final Integer[] arr= {1,2,3,4};
List<Integer> list;
public ImmutableClassWithArray() {
this.list = Collections.unmodifiableList(Arrays.asList(arr));
}
public Integer[] getArr() {
return (Integer[]) this.list.toArray();
}
public static void main(String[] args) {
ImmutableClassWithArray ob = new ImmutableClassWithArray();
System.out.println("list value after copying array "+ob.list.get(2));
ob.arr[2]=5;
System.out.println("arr value after modified "+ob.arr[2]);
Integer[] a = ob.getArr();
System.out.println("a value - "+a[2]);
}
}
公共最终类ImmutableClassWithArray{
私有最终整数[]arr={1,2,3,4};
名单;
公共ImmutableClassWithArray(){
this.list=Collections.unmodifiableList(Arrays.asList(arr));
}
公共整数[]getArr(){
返回(整数[])this.list.toArray();
}
公共静态void main(字符串[]args){
ImmutableClassWithArray ob=新的ImmutableClassWithArray();
System.out.println(“复制数组后的列表值”+ob.list.get(2));
ob.arr[2]=5;
系统输出println(“修改后的arr值”+ob.arr[2]);
整数[]a=ob.getArr();
System.out.println(“a值-”+a[2]);
}
}
输出:->
复制数组3后的列表值
修改后的arr值5
a值为-5
整数[]a=ob.getArr();应返回数组的原始值,因为列表在更改值之前已初始化。
但正如在输出中得到的“值-5”一样,它应该是“值-3”
提前感谢 使数组成为final并不会使其内容不可变。这只是说数组引用本身不能更改 将其包装在
不可修改列表中
只意味着任何人都不能通过列表
接口进行更新
但是,如果您可以访问该数组(正如您所做的),您仍然可以更改其内容,并且不可修改的视图将相应地更新(它只是一个包装器,而不是副本)
如果要保护数组的内容,必须关闭对它的所有访问(将其设置为私有,并且不允许对象的任何方法以任何方式更改其值)
另一件需要注意的小事情是,您正在执行Integer[]a=ob.getArr()代码>在对阵列执行更新之后。因此,使用toArray()
从不可修改列表创建的新数组实例实际上反映了更新的值。请注意,不可修改与不可修改并不相同
对于一个不可变的东西,你无法改变它的状态
对于一个不可修改的对象,您无法通过该对象的接口修改其状态。但是,如果您可以通过其他方式访问数据,例如,您可以直接访问备份阵列,则可以修改备份阵列,并通过不可修改的列表观察更改。阵列。asList
只是阵列的一个视图。您仍然可以修改基础数组<代码>集合。不可修改列表
只是另一个列表的不可变视图,您仍然可以修改基础列表。没有办法制作一个不可变的数组。我知道这是一种黑客行为,在这里尝试着这么做。我的疑问是,当列表已经初始化后,数组基本上发生了改变。仍然是从初始列表中派生的最终数组,它是如何使用更改的数组值进行更新的。