来聊聊JDK集合类(一)

一、集合框架的基本概念

1. 数学背景

在常见用法中,集合(collection)和数学上直观的集(set)的概念是相同的。集是一个唯一项组,也就是说组中没有重复项。实际上,“集合框架”包含了一个 Set 接口和许多具体的 Set 类。 但正式的集概念却比 Java 技术提前了一个世纪,那时英国数学家 George Boole 按逻辑正式的定 义了集的概念。大部分人在小学时通过我们熟悉的维恩图引入的“集的交”和“集的并”学到过一 些集的理论。

image-20200705182919890

集的基本属性如下:

  • 集内只包含每项的一个实例

  • 集可以是有限的,也可以是无限的

  • 可以定义抽象概念

映射是一种特别的集。它是一种对(pair)集,每个对表示一个元素到另一元素的单向映射。一些 映射示例有:

  • IP 地址到域名(DNS)的映射

  • 关键字到数据库记录的映射

  • 字典(词到含义的映射)

  • 2进制到10进制转换的映射

此外,因为映射也是集,所以它们可以是有限的,也可以是无限的。无限映射的一个示例如 2 进 制到 10 进制的转换。不幸的是,“集合框架”不支持无限映射 — 有时用数学函数、公式或算法更 好。但在有限映射能解决问题时,“集合框架”会给 Java 程序员提供一个有用的 API。

因为“集合框架”有类 Set、Collection 和 Map 的正规定义,您会注意到小写的词 set、collection 和 map 把实现和概念区分开来。

2.基本概念

集合是包含多个对象的简单对象,所包含的对象称为元素。集合的典型应用是用来处理多种类

型的对象,这些类型必须有共同的父类。 既然您已经具备了一些集的理论,您应该能够更轻松的理解“集合框架”。 “集合框架”由一

组用来操作对象的接口组成。不同接口描述不同类型的组。在很大程度上,一旦您理解了接口,您 就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使 用上;因此,允许您更改基本的数据结构而不必改变其它代码。框架接口层次结构如下图所示。

Java集合框架

有的人可能会认为 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
2