不可變集合應該在一切能後使用的場合使用,因爲
如果程序內使用了非安全的庫,那麼我們能夠保證傳入的集合不會被修改。
線程安全
內存使用更加高效。
可以作爲一個常量,被任何地方直接引用
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提供了三種構造他們的方法:
使用集合的靜態的copyOf方法, 例如 ImmutableSet.copyOf(set)
直接指定集合元素, 例如 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出一個集合出來,這就變成了線性時間。