Guava之不可變集合

不可變集合優點:

  • 當對象被不可信的庫調用時,不可變形式是安全的;

  • 不可變對象被多個線程調用時,不存在競態條件問題;

  • 不可變集合不需要考慮變化,因此可以節省時間和空間。所有不可變的集合都比它們的可變形式有更好的內存利用率(分析和測試細節);

  • 不可變對象因爲有固定不變,可以作爲常量來安全使用。

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方法。

wKioL1d1zBDxBjRjAAOOY2H033o558.png-wh_50

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章