美文网首页
<>不可变集合

<>不可变集合

作者: monk87 | 来源:发表于2019-05-25 18:26 被阅读0次

原理

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)

相关文章

网友评论

      本文标题:<>不可变集合

      本文链接:https://www.haomeiwen.com/subject/haczzqtx.html