集合

集合是可以在其中儲存其他物件集合的物件。你可以使用 Generics 指定儲存在集合中的資料型別。

集合通常使用 java.utiljava.util.concurrent 名稱空間。

Version <= Java SE 1.4

Java 1.4.2 及更低版本不支援泛型。因此,你無法指定集合包含的型別引數。除了沒有型別安全之外,你還必須使用強制轉換來從集合中獲取正確的型別。

除了 Collection<E> 之外,還有多種主要型別的集合,其中一些具有子型別。

  • List<E> 是一個有序的物件集合。它類似於陣列,但沒有定義大小限制。實現通常會在內部增大以容納新元素。
  • Set<E> 是一組不允許重複的物件。
    • SortedSet<E> 是一個 Set<E>,它也指定了元素排序。
  • Map<K,V> 是鍵/值對的集合。
    • SortedMap<K,V> 是一個 Map<K,V>,它還指定了元素排序。

Version >= Java SE 5

Java 5 新增了一個新的集合型別:

  • Queue<E> 是要按特定順序處理的元素集合。該實現指定這是 FIFO 還是 LIFO。這淘汰了 Stack 類。

Version >= Java SE 6

Java 6 增加了一些新的集合子型別。

  • NavigableSet<E> 是一款內建特殊導航方法的 Set<E>
  • NavigableMap<K,V> 是一款內建特殊導航方法的 Map<K,V>
  • Deque<E> 是一個可以從任何一端讀取的 Queue<E>

請注意,以上專案都是介面。要使用它們,你必須找到適當的實現類,例如 ArrayListHashSetHashMapPriorityQueue

每種型別的集合都有多個具有不同效能指標和用例的實現。

請注意, Liskov 替換原則適用於集合子型別。也就是說,SortedSet<E> 可以傳遞給期望 Set<E> 的函式。有關如何使用具有類繼承的集合的更多資訊,閱讀泛型部分中的有界引數也很有用。

如果要建立自己的集合,可能更容易繼承其中一個抽象類(例如 AbstractList)而不是實現介面。

Version < Java SE 1.2

在 1.2 之前,你必須使用以下類/介面:

  • Vector 而不是 ArrayList
  • Dictionary 而不是 Map。請注意,Dictionary 也是一個抽象類而不是一個介面。
  • Hashtable 而不是 HashMap

這些類已過時,不應在現代程式碼中使用。