java代码之美(4)---guava之Immutable(不可变)集合

Immutable(不可变)集合

 

1、概述

      guava是google的一个库,弥补了java语言的不少方面的不足,不少在java8中已有实现,暂时不展开。Collections是jdk提供的一个工具类。html

      Guava中不可变对象和Collections工具类的unmodifiableSet/List/Map/etc的区别:java

当Collections建立的不可变集合的wrapper类改变的时候,不可变集合也会改变而Guava的Immutable集合保证确实是不可变的编程

一、JDK中实现immutable集合

 在JDK中提供了Collections.unmodifiableXXX系列方法来实现不可变集合, 可是存在一些问题,下面咱们先看一个具体实例:app

public class ImmutableTest {

    @Test
    public void testJDKImmutable(){
        List<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");

        //经过list建立一个不可变的unmodifiableList集合
        List<String> unmodifiableList=Collections.unmodifiableList(list);
        System.out.println(unmodifiableList);

        //经过list添加元素
        list.add("ddd");
        System.out.println("往list添加一个元素:"+list);
        System.out.println("经过list添加元素以后的unmodifiableList:"+unmodifiableList);

        //经过unmodifiableList添加元素
        unmodifiableList.add("eee");
        System.out.println("往unmodifiableList添加一个元素:"+unmodifiableList);

    }
}

运行结果:工具

经过运行结果咱们能够看出:虽然unmodifiableList不能够直接添加元素,可是个人list是能够添加元素的,而list的改变也会使unmodifiableList改变。post

因此说Collections.unmodifiableList实现的不是真正的不可变集合。学习

 二、Guava的immutable集合

      Guava提供了对JDK里标准集合类里的immutable版本的简单方便的实现,以及Guava本身的一些专门集合类的immutable实现。当你不但愿修改一个集合类,ui

或者想作一个常量集合类的时候,使用immutable集合类就是一个最佳的编程实践。 google

注意:每一个Guava immutable集合类的实现都拒绝null值。咱们作过对Google内部代码的全面的调查,而且发现只有5%的状况下集合类容许null值,而95%的状况下url

都拒绝null值。万一你真的须要能接受null值的集合类,你能够考虑用Collections.unmodifiableXXX。

immutable集合能够有如下几种方式来建立:

  一、用copyOf方法, 譬如, ImmutableSet.copyOf(set)

  二、使用of方法,譬如,ImmutableSet.of("a", "b", "c")或者ImmutableMap.of("a", 1, "b", 2)

  三、使用Builder类

举例:

 @Test
    public void testGuavaImmutable(){

        List<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");

        ImmutableList<String> imlist=ImmutableList.copyOf(list);
        System.out.println("imlist:"+imlist);

        ImmutableList<String> imOflist=ImmutableList.of("peida","jerry","harry");
        System.out.println("imOflist:"+imOflist);

        ImmutableSortedSet<String> imSortList=ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");
        System.out.println("imSortList:"+imSortList);

        list.add("baby");
        //关键看这里是否imlist也添加新元素了
        System.out.println("list添加新元素以后看imlist:"+imlist);

        ImmutableSet<Color> imColorSet =
                ImmutableSet.<Color>builder()
                        .add(new Color(0, 255, 255))
                        .add(new Color(0, 191, 255))
                        .build();

        System.out.println("imColorSet:"+imColorSet);
    }

运行结果:发现imlist并未改变。

对于排序的集合来讲有例外,由于元素的顺序在构建集合的时候就被固定下来了。譬如,ImmutableSet.of("a", "b", "c", "a", "d", "b"),对于这个集合的遍历顺序来讲就是"a", "b", "c", "d"。

更智能的copyOf

copyOf方法比你想象的要智能,ImmutableXXX.copyOf会在合适的状况下避免拷贝元素的操做-先忽略具体的细节,可是它的实现通常都是很“智能”的。譬如:

  @Test
        public void testCotyOf(){
            ImmutableSet<String> imSet=ImmutableSet.of("peida","jerry","harry","lisa");
            System.out.println("imSet:"+imSet);

            //set直接转list
            ImmutableList<String> imlist=ImmutableList.copyOf(imSet);
            System.out.println("imlist:"+imlist);

            //list直接转SortedSet
            ImmutableSortedSet<String> imSortSet=ImmutableSortedSet.copyOf(imSet);
            System.out.println("imSortSet:"+imSortSet);

            List<String> list=new ArrayList<String>();
            for(int i=0;i<=10;i++){
                list.add(i+"x");
            }
            System.out.println("list:"+list);

            //截取集合部分元素
            ImmutableList<String> imInfolist=ImmutableList.copyOf(list.subList(2, 8));
            System.out.println("imInfolist:"+imInfolist);
        }

 运行结果

Guava集合和不可变对应关系

可变集合类型 可变集合源:JDK or Guava? Guava不可变集合
Collection JDK ImmutableCollection
List JDK ImmutableList
Set JDK ImmutableSet
SortedSet/NavigableSet JDK ImmutableSortedSet
Map JDK ImmutableMap
SortedMap JDK ImmutableSortedMap
Multiset Guava ImmutableMultiset
SortedMultiset Guava ImmutableSortedMultiset
Multimap Guava ImmutableMultimap
ListMultimap Guava ImmutableListMultimap
SetMultimap Guava ImmutableSetMultimap
BiMap Guava ImmutableBiMap
ClassToInstanceMap Guava ImmutableClassToInstanceMap
Table Guava ImmutableTable

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文参考:Guava学习笔记:Immutable(不可变)集合 感谢!

 

 想太多,作太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多作。中校【12】 

相关文章
相关标签/搜索