集合

集合是可以在其中存储其他对象集合的对象。你可以使用 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

这些类已过时,不应在现代代码中使用。