Guava(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34231010/article/details/82291020

【不可变集合】
    不可变集合就是在初始化时定义好数据,在之后的使用过程中不能再修改的集合。Guava对所有的JDK集合类型和新集合类型都封装了对应的不可变集合。但需要注意的是,所有Guava不可变集合的实现都不接受null值。

一、为什么使用不可变集合
Guava给出了使用原因:
不可变对象有很多优点,包括:
● 当对象被不可信的库调用时,不可变形式是安全的; 
● 不可变对象被多个线程调用时,不存在竞态条件问题
● 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节);
● 不可变对象因为有固定不变,可以作为常量来安全使用。

JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但我们认为不够好:
○ 笨重而且累赘:不能舒适地用在所有想做防御性拷贝的场景;
○ 不安全:要保证没人通过原集合的引用进行修改,返回的集合才是事实上不可变的;
○ 低效:包装过的集合仍然保有可变集合的开销,比如并发修改的检查、散列表的额外空间,等等。

二、不可变集合的使用
1.通过 copyOf() 方法创建

ImmutableSortedSet<String> immutableSortedSet = ImmutableSortedSet.<String>copyOf(new String[]{"2", "1", "3"});  //  [1, 2, 3]

2.通过 of() 方法创建

ImmutableMap<String, Integer> immutableMap = ImmutableMap.<String, Integer>of("a", 2, "b", 1);  //  {a=2, b=1}

3.通过 Builder 创建

ImmutableSet<String> immutableSet = ImmutableSet.<String>builder().add("1").add("2").add("1").build();  //  [1, 2]

    由上可以看出,对于有序不可变集合,在构造时就完成了排序;对于不重复的不可变集合,在构造时会自动去重。

ImmutableXXX.copyOf(ImmutableCollection)会试图对如下情况避免线性时间拷贝:
● 在常量时间内使用底层数据结构是可能的——例如,ImmutableSet.copyOf(ImmutableList)就不能在常量时间内完成。
● 不会造成内存泄露——例如,你有个很大的不可变集合ImmutableList hugeList,ImmutableList.copyOf(hugeList.subList(0, 10))就会显式地拷贝,以免不必要地持有hugeList的引用。
● 不改变语义——所以ImmutableSet.copyOf(myImmutableSortedSet)会显式地拷贝,因为和基于比较器的ImmutableSortedSet相比,ImmutableSet对hashCode()和equals有不同语义。
在可能的情况下避免线性拷贝,可以最大限度地减少防御性编程风格所带来的性能开销。

三、可变集合和不可变集合的关联

可变集合接口 来源 不可变版本
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

猜你喜欢

转载自blog.csdn.net/qq_34231010/article/details/82291020
今日推荐