集合
集合是可以在其中存储其他对象集合的对象。你可以使用 Generics 指定存储在集合中的数据类型。
集合通常使用 java.util
或 java.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>
。
请注意,以上项目都是接口。要使用它们,你必须找到适当的实现类,例如 ArrayList
,HashSet
,HashMap
或 PriorityQueue
。
每种类型的集合都有多个具有不同性能指标和用例的实现。
请注意, Liskov 替换原则适用于集合子类型。也就是说,SortedSet<E>
可以传递给期望 Set<E>
的函数。有关如何使用具有类继承的集合的更多信息,阅读泛型部分中的有界参数也很有用。
如果要创建自己的集合,可能更容易继承其中一个抽象类(例如 AbstractList
)而不是实现接口。
Version < Java SE 1.2
在 1.2 之前,你必须使用以下类/接口:
Vector
而不是ArrayList
Dictionary
而不是Map
。请注意,Dictionary 也是一个抽象类而不是一个接口。Hashtable
而不是HashMap
这些类已过时,不应在现代代码中使用。