一、集合框架的基本概念
1. 数学背景
在常见用法中,集合(collection)和数学上直观的集(set)的概念是相同的。集是一个唯一项组,也就是说组中没有重复项。实际上,“集合框架”包含了一个 Set 接口和许多具体的 Set 类。 但正式的集概念却比 Java 技术提前了一个世纪,那时英国数学家 George Boole 按逻辑正式的定 义了集的概念。大部分人在小学时通过我们熟悉的维恩图引入的“集的交”和“集的并”学到过一 些集的理论。
集的基本属性如下:
-
集内只包含每项的一个实例
-
集可以是有限的,也可以是无限的
-
可以定义抽象概念
映射是一种特别的集。它是一种对(pair)集,每个对表示一个元素到另一元素的单向映射。一些 映射示例有:
-
IP 地址到域名(DNS)的映射
-
关键字到数据库记录的映射
-
字典(词到含义的映射)
-
2进制到10进制转换的映射
此外,因为映射也是集,所以它们可以是有限的,也可以是无限的。无限映射的一个示例如 2 进 制到 10 进制的转换。不幸的是,“集合框架”不支持无限映射 — 有时用数学函数、公式或算法更 好。但在有限映射能解决问题时,“集合框架”会给 Java 程序员提供一个有用的 API。
因为“集合框架”有类 Set、Collection 和 Map 的正规定义,您会注意到小写的词 set、collection 和 map 把实现和概念区分开来。
2.基本概念
集合是包含多个对象的简单对象,所包含的对象称为元素。集合的典型应用是用来处理多种类
型的对象,这些类型必须有共同的父类。 既然您已经具备了一些集的理论,您应该能够更轻松的理解“集合框架”。 “集合框架”由一
组用来操作对象的接口组成。不同接口描述不同类型的组。在很大程度上,一旦您理解了接口,您 就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使 用上;因此,允许您更改基本的数据结构而不必改变其它代码。框架接口层次结构如下图所示。
有的人可能会认为 Map 会继承 Collection。在数学中,映射只是对(pair)的集合。但是, 在“集合框架”中,接口 Map 和 Collection 在层次结构没有任何亲缘关系,它们是截然不同的。 这种差别的原因与 Set 和 Map 在 Java 库中使用的方法有关。Map 的典型应用是访问按关键字存 储的值。它支持一系列集合操作的全部,但操作的是键-值对,而不是单个独立的元素。因此 Map 需 要支持 get() 和 put() 的基本操作,而 Set 不需要。此外,还有返回 Map 对象的 Set 视图的方 法:
1 | Set set = aMap.keySet(); |
用“集合框架”设计软件时,记住该框架四个基本接口的下列层次结构关系会有用处:
- Collection 接口是一组允许重复的对象。
- Set 接口继承 Collection,但不允许重复。
- List 接口继承 Collection,允许重复,并引入位置下标。
- Map 接口既不继承 Set 也不继承 Collection。
让我们转到对框架实现的研究,具体的集合类遵循命名约定,并将基本数据结构和框架接口相 结合。除了四个历史集合类外,Java 框架还引入了六个集合实现,如下表所示。关于历史集合类如何转换、比如说,如何修改 Hashtable 并结合到框架中,请参阅历史集合类。
接口 | 实现 | 历史集合类 |
---|---|---|
Set | HashSet | |
TreeSet | ||
List | ArrayList | Vector |
LinkedList | Stack | |
Map | HashMap | Hashtable |
TreeMap | Properties |
这里没有 Collection 接口的实现。历史集合类,之所以这样命名是因为从 Java 类库 1.0 发 行版就开始沿用至今了。
如果从历史集合类转换到新的框架类,主要差异之一在于所有的操作都和新类不同步。您可以 往新类中添加同步的实现,但您不能把它从旧的类中除去。
二、Collection接口
1.Collection接口
Collection 接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。
该接口支持如添加和除去等基本操作。设法除去一个元素时,如果这个元素存在,除去的仅仅 是集合中此元素的一个实例。
1 |