Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改不可变数组不工作_Java_Arrays_Immutability - Fatal编程技术网

Java 修改不可变数组不工作

Java 修改不可变数组不工作,java,arrays,immutability,Java,Arrays,Immutability,修改了使数组不可变的代码,但在某些地方出错了。在代码中,当为ImmutableClassWithArray创建对象时,列表将使用给定数组初始化。在getter内部,将返回不可修改的列表,并将其转换为数组。然后修改数组。即使在调用构造函数后数组被更改,也意味着在列表已经用一些值初始化之后,最终数组仍然会用更新后的值反映出来 public final class ImmutableClassWithArray { private final Integer[] arr= {1,2,3,4}

修改了使数组不可变的代码,但在某些地方出错了。在代码中,当为ImmutableClassWithArray创建对象时,列表将使用给定数组初始化。在getter内部,将返回不可修改的列表,并将其转换为数组。然后修改数组。即使在调用构造函数后数组被更改,也意味着在列表已经用一些值初始化之后,最终数组仍然会用更新后的值反映出来

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
只是阵列的一个视图。您仍然可以修改基础数组<代码>集合。不可修改列表
只是另一个列表的不可变视图,您仍然可以修改基础列表。没有办法制作一个不可变的数组。我知道这是一种黑客行为,在这里尝试着这么做。我的疑问是,当列表已经初始化后,数组基本上发生了改变。仍然是从初始列表中派生的最终数组,它是如何使用更改的数组值进行更新的。