不可变集合应该在一切能后使用的场合使用,因为

  1. 如果程序内使用了非安全的库,那么我们能够保证传入的集合不会被修改。

  2. 线程安全

  3. 内存使用更加高效。

  4. 可以作为一个常量,被任何地方直接引用


Guava给自己特有和JAVA本地的一些集合实提供了对应的不可变版本如下:


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提供了三种构造他们的方法: 

  1. 使用集合的静态的copyOf方法, 例如 ImmutableSet.copyOf(set)

  2. 直接指定集合元素, 例如 ImmutableSet.of("a", "b", "c") 

3. 通过Build方法 例如

ublic static final ImmutableSet<Color> GOOGLE_COLORS =
       
ImmutableSet.<Color>builder()
           
.addAll(WEBSAFE_COLORS)
           
.add(new Color(0, 191, 255))
           
.build();


此外另外值得一提的就是Guava为所有的不可变集合都提供了asList()方法,它返回一个不可变List, 使我们能够很快查询集合中第#个元素。 Guava在文档中集合的copyOf()在某些时候能到达线性时间,它列出了三点。其实看源码就知道Guava 是想近一切办法返回传入集合的变形,如果是这样就是花费常量时间,否则就需要查看底层元素重新COPY出一个集合出来,这就变成了线性时间。