不可變集合優點:
當對象被不可信的庫調用時,不可變形式是安全的;
不可變對象被多個線程調用時,不存在競態條件問題;
不可變集合不需要考慮變化,因此可以節省時間和空間。所有不可變的集合都比它們的可變形式有更好的內存利用率(分析和測試細節);
不可變對象因爲有固定不變,可以作爲常量來安全使用。
public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( "red", "orange", "yellow", "green", "blue", "purple");
注意事項:所有Guava不可變集合的實現都不接受null值。
使用不可變集合:
copyOf方法,比如如ImmutableSet.copyOf(set);
of方法,比如ImmutableSet.of(“a”, “b”, “c”)或 ImmutableMap.of(“a”, 1, “b”, 2);
Builder工具,比如:
public static final ImmutableSet<Color> GOOGLE_COLOS = ImmutableSet.<Color>builder().addAll(WEBSAFE_COLORS) .add(new Color(0,191,255)) .build();
此外,對有序不可變集合來說,排序是在構造集合的時候完成的。如:
ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");
會在構造時把元素排序爲a,b,c,d。
比想象更智能的copyOf:
在常量時間內使用底層數據結構是可能的——例如,ImmutableSet.copyOf(ImmutableList)就不能在常量時間內完成。
不會造成內存泄露——例如,你有個很大的不可變集合ImmutableList<String> hugeList, ImmutableList.copyOf(hugeList.subList(0, 10))就會顯式地拷貝,以免不必要地持有hugeList的引用。
不改變語義——所以ImmutableSet.copyOf(myImmutableSortedSet)會顯式地拷貝,因爲和基於比較器的ImmutableSortedSet相比,ImmutableSet對hashCode()和equals有不同語義。
asList視圖
所有不可變集合都有一個asList()方法提供ImmutableList視圖,來幫助你用列表形式方便地讀取集合元素。例如,你可以使用sortedSet.asList().get(k)從ImmutableSortedSet中讀取第k個最小元素。
asList()返回的ImmutableList通常是——並不總是——開銷穩定的視圖實現,而不是簡單地把元素拷貝進List。也就是說,asList返回的列表視圖通常比一般的列表平均性能更好,比如,在底層集合支持的情況下,它總是使用高效的contains方法。