public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( "red", "orange", "yellow", "green", "blue", "purple"); class Foo { Set<Bar> bars; Foo(Set<Bar> bars) { this.bars = ImmutableSet.copyOf(bars); // defensive copy! } }
不可變對象有不少優勢,包括:java
建立對象的不可變拷貝是一項很好的防護性編程技巧。Guava爲全部JDK標準集合類型和Guava新集合類型都提供了簡單易用的不可變版本。
JDK也提供了Collections.unmodifiableXXX方法把集合包裝爲不可變形式,但咱們認爲不夠好:面試
若是你沒有修改某個集合的需求,或者但願某個集合保持不變時,把它防護性地拷貝到不可變集合是個很好的實踐。算法
重要提示:全部Guava不可變集合的實現都不接受null值。咱們對Google內部的代碼庫作過詳細研究,發現只有5%的狀況須要在集合中容許null元素,剩下的95%場景都是遇到null值就快速失敗。若是你須要在不可變集合中使用null,請使用JDK中的Collections.unmodifiableXXX方法。更多細節建議請參考「使用和避免null」。spring
不可變集合能夠用以下多種方式建立:數據庫
public static final ImmutableSet<Color> GOOGLE_COLORS = 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。設計模式
請注意,ImmutableXXX.copyOf方法會嘗試在安全的時候避免作拷貝——實際的實現細節不詳,但一般來講是很智能的,好比:緩存
ImmutableSet<String> foobar = ImmutableSet.of("foo", "bar", "baz"); thingamajig(foobar); void thingamajig(Collection<String> collection) { ImmutableList<String> defensiveCopy = ImmutableList.copyOf(collection); ... }
在這段代碼中,ImmutableList.copyOf(foobar)會智能地直接返回foobar.asList(),它是一個ImmutableSet的常量時間複雜度的List視圖。
做爲一種探索,ImmutableXXX.copyOf(ImmutableCollection)會試圖對以下狀況避免線性時間拷貝:安全
全部不可變集合都有一個asList()方法提供ImmutableList視圖,來幫助你用列表形式方便地讀取集合元素。例如,你可使用sortedSet.asList().get(k)從ImmutableSortedSet中讀取第k個最小元素。數據結構
asList()返回的ImmutableList一般是——並不老是——開銷穩定的視圖實現,而不是簡單地把元素拷貝進List。也就是說,asList返回的列表視圖一般比通常的列表平均性能更好,好比,在底層集合支持的狀況下,它老是使用高效的contains方法。
私信回覆 資料 領取一線大廠Java面試題總結+阿里巴巴泰山手冊+各知識點學習思惟導+一份300頁pdf文檔的Java核心知識點總結!
這些資料的內容都是面試時面試官必問的知識點,篇章包括了不少知識點,其中包括了有基礎知識、Java集合、JVM、多線程併發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java算法、數據庫、Zookeeper、分佈式緩存、數據結構等等。