Guava引入了很多JDK沒有的、但有用的新集合型別。這些新型別是為了和JDK集合框架共存,而沒有往JDK集合抽象中硬塞其他概念。

作為一般規則,Guava集合非常精準地遵循了JDK介面契約。

1. Multiset

統計一個詞在文件中出現了多少次,傳統的做法是這樣的:

Multiset和Set的區別就是可以儲存多個相同的物件。在JDK中,List和Set有一個基本的區別,就是List可以包含多個相同物件,且是有順序的,而Set不能有重複,且不保證順序(有些實現有順序,例如LinkedHashSet和SortedSet等)所以Multiset佔據了List和Set之間的一個灰色地帶:允許重複,但是不保證順序。

使用Multiset,直接上程式碼:

2. Multimap

每個有經驗的Java程式設計師都在某處實現過Map<K, List<V>>或Map<K, Set<V>>。

Guava的Multimap可以很容易地把一個鍵對映到多個值。

3. BiMap

傳統上,實現鍵值對的雙向對映需要維護兩個單獨的map,並保持它們間的同步。但這種方式很容易出錯,而且對於值已經在map中的情況,會變得非常混亂。

BiMap<K, V>是特殊的Map:

  • 可以用 inverse()反轉BiMap<K, V>的鍵值對映
  • 保證值是唯一的,因此values()返回Set而不是普通的Collection

在BiMap中,如果你想把鍵對映到已經存在的值,會丟擲IllegalArgumentException異常。如果對特定值,你想要強制替換它的鍵,請使用BiMap.forcePut(key, value)。

4. Table

通常來說,當你想使用多個鍵做索引的時候,你可能會用類似Map<FirstName, Map<LastName, Person>>的實現,這種方式很醜陋,使用上也不友好。

Guava為此提供了新集合型別Table,它有兩個支援所有型別的鍵:”行”和”列”。