Java 私塾跟我学系列——JAVA 篇 网址:http://www.javass.cn 电话:010-68434236
一:集合框架的基本概念
1:数学背景
在常见用法中,
集合(
collection
)
和数学上直观的
集(
set
)
的概念是相同的。集是
一个唯一项组,也就是说组中没有重复项。数学上集的概念比 Java 技术提前了一个世纪,
那时英国数学家 George Boole 按逻辑正式的定义了集的概念。大部分人在小学时通过我们
熟悉的维恩图引入的“集的交”和“集的并”学到过一些集的理论。
(1)集的一些现实的示例如下:
• 大写字母集“A”到“Z”
• 非负整数集{0, 1, 2 ...}
• 保留的 Java 编程语言关键字集 {'import', 'class', 'public',
'protected'...}
• 人集(friends, employees, clients, ...)
• 数据库查询返回记录集
• Container 的 Component 对象集
• 所有对(pair)集
• 空集{}
(2)集的基本属性如下:
• 集内只包含每项的一个实例
• 集可以是有限的,也可以是无限的
• 可以定义抽象概念
(3)映射是一种特别的集。它是一种对(pair)集,每个对表示一个元素到另一元素的单
向映射。一些映射示例有:
IP 地址到域名(DNS)的映射
关键字到数据库记录的映射
字典(词到含义的映射)
2 进制到 10 进制转换的映射
此外,因为映射也是集,所以它们可以是有限的,也可以是无限的。无限映射的一个示
例如 2 进制到 10 进制的转换。不幸的是,“集合框架”不支持无限映射 — 有时用数学函
数、公式或算法更好。但在有限映射能解决问题时,“集合框架”会给 Java 程序员提供一
个有用的 API。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
Java 私塾跟我学系列——JAVA 篇 网址:http://www.javass.cn 电话:010-68434236
2:基本概念
2.1:什么是集合
集合是包含多个对象的简单对象,所包含的对象称为元素。
集合里面可以包含任意多个对象,数 量 可以变化;同时对对象的类型也没有限制,也就
是说集合里面的所有对象的类型可以相同,也可以不同。
2.2:集合里面有什么
既然您已经具备了一些集的理论,您应该能够更轻松的理解“集合框架”。 “集合框架”
由一组用来操作对象的接口组成。不同接口描述不同类型的组。虽然您总要创建接口特定的
实现,但访问实际集合的方法应该限制在接口方法的使用上;因此,允许您更改基本的数据
结构而不必改变其它代码。集合框架接口层次结构如下图所示。
有的人可能会认为 Map 会继承 Collection。在数学中,映射只是对(pair)的集合。
但是,在“集合框架”中,接口 Map 和 Collection 在层次结构没有任何亲缘关系,它
们是截然不同的。这种差别的原因与 Set 和 Map 在 Java 库中使用的方法有关。Map 的
典型应用是访问按关键字存储的值。它支持一系列集合操作的全部,但操作的是键-值对,
而不是单个独立的元素。因此 Map 需要支持 get() 和 put() 的基本操作,而 Set 不需要。
此外,还有返回 Map 对象的 Set 视图的方法:Set set = aMap.keySet();
让我们转到对框架实现的研究,具体的集合类遵循命名约定,并 将 基 本数据结构和框架
接口相结合。除了四个历史集合类外,Java 框架还引入了六个集合实现,如下表所示。关
于历史集合类如何转换、比如说,如何修改 Hashtable 并结合到框架中,请参阅历史集
合类。
接口 实现 历史集合类
Set HashSet
TreeSet
List ArrayList Vector
LinkedList Stack
Map HashMap Hashtable
TreeMap Properties
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
Java 私塾跟我学系列——JAVA 篇 网址:http://www.javass.cn 电话:010-68434236
这里没有 Collection 接口的实现。历史集合类,之所以这样命名是因为从 Java 类
库 1.0 发行版就开始沿用至今了。
如果从历史集合类转换到新的框架类,主要差异之一在于所有的操作都和新类不同步。
您可以往新类中添加同步的实现,但您不能把它从旧的类中除去。
2.3:集合框架中各接口的特点
用“集合框架”设计软件时,记住该框架四个基本接口的下列层次结构关系会有用处:
Collection 接口是一组允许重复的对象。
Set 接口继承 Collection,无序但不允许重复。
List 接口继承 Collection,有序但允许重复,并引入位置下标。
Map 接口既不继承 Set 也不继承 Collection,是键值对。
二:Collection 接口
1:Collection 接口
Collection 接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素
时,就使用这一接口。这里是以统一建模语言(Unified Modeling Language(UML)) 表 示
法 表 示的 Collection 公有方法清单。
该接口支持如添加和除去等基本操作。设法除去一个元素时,如 果 这 个 元素存在,除去
的仅仅是集合中此元素的一个实例。
boolean add(Object element)
boolean remove(Object element)
Collection 接口还支持查询操作:
int size()
boolean isEmpty()
boolean contains(Object element)
Iterator iterator()
2:Iterator 接口
Collection 接口的 iterator() 方法返回一个 Iterator。Iterator 和您可能
已经熟悉的 Enumeration 接口类似,我们将在 Enumeration 接口中对 Enumeration 进行
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
Java 私塾跟我学系列——JAVA 篇 网址:http://www.javass.cn 电话:010-68434236
讨论。使用 Iterator 接口方法,您可以从头至尾遍历集合,并 安 全 的 从 底 层 Collection
中除去元素:
remove() 方法可由底层集合有选择的支持。当底层集合调用并支持该方法时,最近
一次 next() 调用返回的元素就被除去。为演示这一点,用于常规 Collection 的
Iterator 接口代码如下:
Collection collection = ...;
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object element = iterator.next();
if (removalCheck(element)) {
iterator.remove();
}
}
3:组操作
Collection 接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于
整个集合的任务。
boolean containsAll(Collection collection)
boolean addAll(Collection collection)
void clear()
void removeAll(Collection collection)
void retainAll(Collection collection)
containsAll() 方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集
合是否是当前集合的
子集
。其余方法是可选的,因为特定的集合可能不支持集合更改。
addAll() 方法确保另一个集合中的所有元素都被添加到当前的集合中,通常称为
并
。
clear() 方法从当前集合中除去所有元素。
removeAll() 方法类似于 clear() ,但只除去了元素的一个子集。
retainAll() 方法类似于 removeAll() 方法,不过可能感到它所做的与前面正好相反:它
从当前集合中除去不属于另一个集合的元素,即
交
。
三:Set 接口
1:Set 接口
按照定义,Set 接口继承 Collection 接口,而且它不允许集合中存在重复项。所有
原始方法都是现成的,没有引入新方法。具体的 Set 实现类依赖添加的对象的 equals() 方
法来检查等同性。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn