Java中不可变数组

问题

是否可以将一个数组封装,使数组内容具有不可变性?

分析

1.数组

在java中,数组是一种引用类型,用来存储固定大小的同类型元素。在内存中,数组对象存在栈中,而数组元素存储在堆中,当创建一个数组对象后,会在堆中开辟相应的内存区域,此时数组对象指向这块内存的存储地址。

2.不可变对象:

java中的不可变对象指的是:该对象被创建后,对象所有的状态和属性在其生命周期内不会改变。

3.final关键字:

在java中,对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
举例说明
final int[] nums= new int[] {5,2,6,23,54,3};
nums[0] = 55;

该情况成立,因为nums[0]修改的是数组元素,并没有修改nums数组对象本身的状态。但是若是以下情况,将不被允许:
final int[] nums = new int[20];
nums = new int[10];

上述操作已经修改了nums数组对象本身的状态,是不允许的。

建议

如果一定要保护数组内容不被修改,建议使用容器类库使用一个不可修改的封装类来代替数组的使用,比如:
List nums= Collections.unmodifiableList(Arrays.asList(5,2,234,23));

在unmodifiableList类的实现中,除了读操作以外,其他list的相关操作诸如add,remove,clear等操作都会抛出UnsupportedOperationException异常,以此保证list的不可修改性。

你可能感兴趣的:(Java中不可变数组)