Java 包装只读集合

不可变 vs 不可修改

Immutable 和 Unmodifiable区别


Collection类提供包装方法,可以把普通集合包装成不可修改的Unmodifiable集合,不可修改实际上是一个视图
使用当前不可修改集合虽然不能进行增删操作

Sample
1
2
3
4
List<String> originalList = new ArrayList<>();
originalList.add("foo");
List<String> unmodifiableList = Collections.unmodifiableList(originalList);
unmodifiableList.add("bar"); //java.lang.UnsupportedOperationException

但是别人对集合的变化还是会反映出来

Sample
1
2
3
4
5
List<String> originalList = new ArrayList<>();
originalList.add("foo");
List<String> unmodifiableList = Collections.unmodifiableList(originalList);
originalList.add("bar");
System.out.println(unmodifiableList.size()); //2

Immutable的机制更类似于快照,使用Guava提供的不可变集合类复制后,和原始集合脱离了关系

Sample
1
2
3
4
5
List<String> originalList = new ArrayList<>();
originalList.add("foo");
List<String> immutableList = ImmutableList.copyOf(originalList);
originalList.add("bar");
System.out.println(immutableList.size()); //foo

即不可变包装后,彻底脱离了原集合,而不可修改包装后只是一个只读视图
最后无论是不可修改还是不可变,都是约束集合的,不约束集合内部的数据,内部数据的可变性不受影响。