本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发行说明了解所有JDK版本的新功能、增强功能以及已删除或弃用的选项的信息。
核心集合接口封装了不同类型的集合,如下图所示。这些接口允许独立于集合的具体表示方式对集合进行操作。核心集合接口是Java集合框架的基础。如下图所示,核心集合接口形成了一个层次结构。
核心集合接口。
Set
是一种特殊的Collection
,SortedSet
是一种特殊的Set
,依此类推。请注意层次结构由两个不同的树组成——Map
不是真正的Collection
。
请注意,所有核心集合接口都是泛型的。例如,这是Collection
接口的声明。
public interface Collection<E>...
<E>
语法告诉你该接口是泛型的。当你声明一个Collection
实例时,可以并且应该指定集合中包含的对象的类型。指定类型允许编译器在编译时验证你放入集合中的对象的类型是否正确,从而减少运行时错误。有关泛型类型的信息,请参阅泛型(更新)课程。
当你理解如何使用这些接口时,你将了解到Java集合框架的大部分内容。本章讨论了有效使用接口的一般准则,包括何时使用哪个接口。你还将学习每个接口的编程惯用语,以帮助你充分利用它们。
为了使核心集合接口的数量可管理,Java平台没有为每种集合类型的每个变体提供单独的接口。(这些变体可能包括不可变、固定大小和追加只读等。)相反,每个接口中的修改操作都被指定为可选的——给定的实现可以选择不支持所有操作。如果调用了不支持的操作,集合会抛出一个UnsupportedOperationException
。实现负责记录它们支持哪些可选操作。Java平台的通用实现都支持所有可选操作。
下面的列表描述了核心集合接口:
Collection
— 集合层次结构的根。集合表示一组称为其元素的对象。 Collection
接口是所有集合实现的最低公共分母,并且用于在需要最大通用性时传递和操作集合。某些类型的集合允许重复元素,而其他类型则不允许。有些是有序的,而其他是无序的。Java平台没有直接提供此接口的任何实现,但提供了更具体的子接口的实现,例如 Set
和 List
。另请参阅 集合接口 部分。Set
— 不能包含重复元素的集合。该接口模拟了数学集合抽象,用于表示集合,例如组成一手扑克牌的卡片,组成学生课程表的课程,或者在计算机上运行的进程。另请参阅 集合接口 部分。List
— 有序集合(有时称为序列)。List
可以包含重复元素。使用 List
的用户通常可以精确控制每个元素在列表中的插入位置,并且可以通过整数索引(位置)访问元素。如果您使用过 Vector
,那么您对 List
的一般特点应该很熟悉。另请参阅 列表接口 部分。Queue
— 用于在处理之前保存多个元素的集合。除了基本的 Collection
操作外,Queue
还提供了额外的插入、提取和检查操作。
队列通常以FIFO(先进先出)的方式对元素排序,但不一定如此。优先队列是例外,它根据提供的比较器或元素的自然顺序对元素进行排序。无论使用哪种排序方式,队列的头部都是通过调用 remove
或 poll
方法将被移除的元素。在FIFO队列中,所有新元素都插入到队列的尾部。其他类型的队列可能使用不同的放置规则。每个 Queue
实现必须指定其排序属性。另请参阅 队列接口 部分。
Deque
— 用于在处理之前保存多个元素的集合。除了基本的 Collection
操作外,Deque
还提供了额外的插入、提取和检查操作。
Deque 既可以用作FIFO(先进先出),也可以用作LIFO(后进先出)。在双端队列中,所有新元素都可以从两端插入、检索和删除。另请参阅 双端队列接口 部分。
Map
— 将键映射到值的对象。一个 Map
不能包含重复键;每个键最多只能映射到一个值。如果您已经使用过 Hashtable
,那么您已经对 Map
的基本知识很熟悉了。另请参阅 映射接口 部分。最后两个核心集合接口只是Set
和Map
的排序版本:
SortedSet
— 一个Set
,它以升序维护其元素。提供了几个额外的操作来利用排序。排序集用于自然有序的集合,例如单词列表和会员名单。还请参阅SortedSet接口部分。SortedMap
— 一个Map
,它以升序维护其映射关系的键。这是SortedSet
的Map
类似物。排序映射用于自然有序的键值对集合,例如字典和电话簿。还请参阅SortedMap接口部分。要了解排序接口如何维护其元素的顺序,请参阅对象排序部分。