原理
jdk为了满足对不可变集合的需求,提供了
Collections.unmodifiableList
等方法 来支持,其实现方式是 ,在方法中生成一个UnmodifiableList
,并且把参数中集合的数据作为新对象的元素。并且把UnmodifiableList
返回给调用者。
UnmodifiableList
等集合类都集成了Collection
并且对集合的通用函数做了屏蔽,如下所示 ,所以在拿到UnmodifiableList
实例之后,在对其进行修改操作,就会报不支持操作的异常了 。也就保证了集合不能被修改的特性了。
public boolean add(E e) {
throw new UnsupportedOperationException();
}
public boolean remove(Object o) {
throw new UnsupportedOperationException();
}
public boolean containsAll(Collection<?> coll) {
return c.containsAll(coll);
}
public boolean addAll(Collection<? extends E> coll) {
throw new UnsupportedOperationException();
}
public boolean removeAll(Collection<?> coll) {
throw new UnsupportedOperationException();
}
public boolean retainAll(Collection<?> coll) {
throw new UnsupportedOperationException();
}
public void clear() {
throw new UnsupportedOperationException();
}
创建方式
- 使用jdk提供的接口创建
- 使用guava的
public static void main(String[] args) {
//构建一个初始集合
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
//jdk
List<String> unmodifiableList = Collections.unmodifiableList(strings);
//guava
ImmutableList<String> stringImmutableList = ImmutableList.copyOf(strings);
//test
// unmodifiableList.add("ss");
stringImmutableList.add("hell");
}
执行相应的修改会报错如下
Exception in thread "main" java.lang.UnsupportedOperationException
at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:221)
at cn.zuosh.tessb.service.TestUnmutable.main(TestUnmutable.java:22)
网友评论