4.1 集合框架概述
集合用于存储、检索、操作和传递聚合数据,有点像简易版本的内存数据库,因此集合有时候也被称为容器。通常,集合用来表示形成自然组的数据项,例如扑克牌(卡片集合)、邮件文件夹(字母集合)或电话目录(名称到电话号码的映射)。如果之前已经使用过Java或者其他任何编程语言,那么对于集合应该不会陌生。
4.1.1 集合框架的定义
集合框架(Collections Framework)是用于表示和操作集合的统一体系结构。所有集合框架都包含以下内容:
· 接口:表示集合的抽象数据类型。接口允许独立于其表示的细节来操纵集合。在面向对象语言中,接口通常形成层次结构。
· 实现:集合接口的具体实现。实质上,它们是可重用的数据结构。
· 算法:对实现集合接口的对象执行有用计算(如搜索和排序)的方法。算法被认为是多态的,也就是说,相同的方法可以用于适当的集合接口的许多不同实现。实质上,算法是可重用的功能。
除了Java集合框架之外,最著名的集合框架示例是C ++标准模板库(STL)和Smalltalk的集合层次结构。从历史上看,集合框架相当复杂,这使得它们具有陡峭的学习曲线的声誉。我们相信Java集合框架打破了这一传统。
4.1.2 Java集合框架的优点
Java集合框架提供以下优点:
· 减少编程工作:通过提供有用的数据结构和算法,集合框架可以让开发者专注于程序的业务部分。通过促进不相关API之间的互操作性,Java集合框架使开发者无须编写适配器对象或转换代码来连接API。
· 提高程序速度和质量:Java集合框架提供有用数据结构和高性能、高质量的算法实现,每个接口的各种实现是可互换的,因此可以通过切换集合实现来轻松调整程序。因为无须花精力重复编写底层数据结构的操作,所以开发者可以有更多的时间用于改进程序的质量和性能。
· 允许不相关的API之间的互操作性:集合接口的API能够无缝实现本地数据与网络数据的互操作。
· 减少学习和使用新API的工作量:许多API自然地在输入上收集集合并将它们作为输出提供。过去,每个这样的API都有一个专门用于操作其集合的小型子API。这些集合子API之间几乎没有一致性,因此开发者必须从头开始学习每一个,并且在使用它们时很容易出错。随着标准集合接口的出现,问题就消失了。
· 减少设计新API的工作量:设计人员和实施人员每次创建依赖于集合的API时都不必重新发明轮子;相反,他们可以使用标准的集合接口促进。对于实现这些接口的对象进行操作的新算法也是如此。
4.1.3 集合框架常见的接口
Java集合框架中的核心集合接口封装了不同类型的集合,这些接口允许独立于其表示的细节来操纵集合。核心集合接口是Java集合框架的基础。核心集合接口可形成层次结构,如图4-1所示。
图4-1 核心集合接口
在图4-1中,主要有两个接口树。一个以Collection开头,包括Set、SortedSet、List和Queue。Set是一种特殊的Collection,而SortedSet是一种特殊的Set,以此类推。另一个以Map开头,包括SortedMap。这意味着Map不是真正的Collection。
核心集合接口的描述如下:
· Collection:集合层次结构的根。集合表示包含一组元素的对象。Collection接口是所有集合实现的最小公分母,用于传递集合并在需要最大通用性时对其进行操作。某些类型的集合允许重复元素,而其他集合则不允许。有些是有序的,有些则是无序的。Java平台不提供此接口的任何直接实现,但提供了更具体的子接口的实现,例如Set和List。
· Set:不能包含重复元素的集合。该接口对数学集抽象进行建模,并用于表示集合,例如包含扑克牌的牌,构成学生日程的课程或在机器上运行的过程。
· List:有序集合(有时称为序列)。List可以包含重复元素。List的用户通常可以精确控制列表中每个元素的插入位置,并可以通过整数索引(位置)访问元素。
· Queue:用于在处理之前保存多个元素的集合。除了基本的Collection操作外,Queue还提供额外的插入、提取和检查操作。Queue通常(但不一定)以FIFO(先进先出)方式对元素进行排序,但优先级队列除外。优先级队列根据提供的比较器或元素的自然顺序对元素进行排序。无论使用什么顺序,队列的头部都是通过调用删除或轮询删除的元素。在FIFO队列中,所有新元素都插入队列的尾部。其他类型的队列可能使用不同的放置规则。每个Queue实现都必须指定其排序属性。
· Deque:用于在处理之前保存多个元素的集合。除了基本的集合操作外,Deque还提供额外的插入、提取和检查操作。Deque可用作FIFO(先进先出)和LIFO(后进先出)。在双端队列中,可以在两端插入、检索和删除所有新元素。
· Map:将键映射到值的对象。Map不能包含重复的键。每个键最多可以映射一个值。
· SortedSet:一个按升序维护其元素的Set。提供了几个额外的操作以利用排序。SortedSet用于自然排序的集合,例如单词列表和成员成绩表等。
· SortedMap:按升序键顺序维护的Map。这是SortedSet的Map模拟。SortedMap用于自然排序的键/值对集合,例如字典和电话目录等。
4.1.4 集合框架的实现
集合框架的每个接口都有默认实现。其实现主要分为以下几类:
· 通用实现:这是最常用的实现,专为日常使用而设计。
· 专用实现:旨在用于特殊情况,并显示非标准性能特征,使用限制或行为。
· 并发实现:旨在支持高并发性,通常以单线程性能为代价。这些实现是java.util.concurrent包的一部分。
· 包装器实现:与其他类型的实现(通常是通用实现)结合使用,以提供增加或限制的功能。
· 便利实现:通常通过静态工厂方法提供的小型实现,为特殊集合(例如,单例集)的通用实现提供方便、有效的替代方案。
· 抽象实现:这是骨架实现,有助于构建自定义的实现。Java允许开发者自定义集合的实现,但大多数情况下并不需要这么做。
Java提供的集合框架接口的实现如表4-1所示。
表4-1 集合框架接口的实现
后续章节还将继续介绍这些实现的具体使用方式。