Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误与异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java APIs与框架

Java 类引用

Java 有用资源

Java集合框架



在 Java 2 之前,Java 提供了临时类,例如Dictionary、Vector、StackProperties 来存储和操作对象组。虽然这些类非常有用,但它们缺乏一个核心统一的主题。因此,使用 Vector 的方式与使用 Properties 的方式不同。

为什么需要集合框架?

集合框架的设计是为了满足几个目标,例如:

  • 该框架必须具有高性能。基本集合(动态数组、链表、树和哈希表)的实现必须高效。

  • 该框架必须允许不同类型的集合以类似的方式工作,并具有高度的互操作性。

  • 该框架必须能够轻松扩展和/或适配集合。

为此,整个集合框架都是围绕一组标准接口设计的。提供了几个这些接口的标准实现,例如LinkedList、HashSetTreeSet,您可以按原样使用它们,也可以根据需要实现您自己的集合。

Java 集合框架

集合框架是表示和操作集合的统一架构。所有集合框架都包含以下内容:

  • 接口 − 这些是表示集合的抽象数据类型。接口允许独立于其表示细节来操作集合。在面向对象语言中,接口通常形成层次结构。

  • 实现,即 − 这些是集合接口的具体实现。从本质上讲,它们是可重用的数据结构。

  • 算法 − 这些是在实现集合接口的对象上执行有用计算(例如搜索和排序)的方法。据说算法是多态的:即,相同的方法可以用于许多不同实现的适当集合接口。

除了集合之外,框架还定义了几个映射接口和类。映射存储键/值对。虽然映射并非集合(按术语的正确用法),但它们与集合完全集成。

集合框架的层次结构

集合框架的所有类和接口都可以在java.util 包中找到。下图显示了 Java 中集合框架的层次结构。(此处应插入图表)

Hierarchy of Collection Framework

Java 集合接口

集合框架定义了几个接口。本节概述每个接口:

序号 接口与描述
1 Collection 接口

这使您可以使用对象组;它是集合层次结构的顶层。

2 List 接口

这扩展了Collection,List 的实例存储元素的有序集合。

3 Set 接口

这扩展了 Collection 来处理集合,集合必须包含唯一元素。

4 SortedSet 接口

这扩展了 Set 来处理排序集合。

5 Map 接口

这将唯一键映射到值。

6 Map.Entry 接口

这描述了映射中的元素(键/值对)。这是 Map 的内部类。

7 SortedMap 接口

这扩展了 Map,以便键按升序维护。

8 Enumeration 接口

这个遗留接口定义了您可以枚举(一次获取一个)对象集合中的元素的方法。这个遗留接口已被 Iterator 取代。

Java 集合类

Java 提供了一组实现 Collection 接口的标准集合类。一些类提供了完整的实现,可以按原样使用,而另一些是抽象类,提供骨架实现,用作创建具体集合的起点。

标准集合类总结在下表中:

序号 类与描述
1

AbstractCollection 类

实现了大部分 Collection 接口。

2

AbstractList 类

扩展 AbstractCollection 并实现 List 接口的大部分功能。

3

AbstractSequentialList

扩展 AbstractList,供使用顺序访问(而非随机访问)元素的集合使用。

4 LinkedList

通过扩展 AbstractSequentialList 实现链表。

5 ArrayList

通过扩展 AbstractList 实现动态数组。

6

AbstractSet

扩展 AbstractCollection 并实现 Set 接口的大部分功能。

7 HashSet

扩展 AbstractSet,用于哈希表。

8 LinkedHashSet

扩展 HashSet,允许按插入顺序迭代。

9 TreeSet

实现存储在树中的集合。扩展 AbstractSet。

10

AbstractMap

实现 Map 接口的大部分功能。

11 HashMap

扩展 AbstractMap,使用哈希表。

12 TreeMap

扩展 AbstractMap,使用树。

13 WeakHashMap

扩展 AbstractMap,使用具有弱键的哈希表。

14 LinkedHashMap

扩展 HashMap,允许按插入顺序迭代。

15 IdentityHashMap

扩展 AbstractMap,在比较文档时使用引用相等性。

AbstractCollection、AbstractSet、AbstractList、AbstractSequentialListAbstractMap 类提供了核心集合接口的骨架实现,以最大限度地减少实现它们所需的努力。

前面章节讨论了 java.util 定义的以下遗留类:

序号 类与描述
1 Vector

实现动态数组。它类似于 ArrayList,但有一些区别。

2 Stack

Stack 是 Vector 的子类,实现标准的后进先出 (LIFO) 栈。

3 Dictionary

Dictionary 是一个抽象类,表示键值存储库,其功能与 Map 非常相似。

4 Hashtable

Hashtable 是最初的 java.util 的一部分,是 Dictionary 的具体实现。

5 Properties

Properties 是 Hashtable 的子类。它用于维护值列表,其中键是字符串,值也是字符串。

6 PriorityQueue

PriorityQueue 类是基于优先级堆的无界优先级队列。依赖自然排序的优先级队列也不允许插入不可比较的对象。

7 BitSet

BitSet 类创建一个特殊类型的数组,用于保存位值。此数组可以根据需要增加大小。

8 ArrayDeque

ArrayDeque 类提供可调整大小的数组并实现 Deque 接口。数组双端队列没有容量限制,因此它们会根据需要增长以支持使用。

9 EnumMap

EnumMap 类是一个专门的 Map 实现,用于枚举键。枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。

10 Queue

Queue 接口在 java.util 包中提供,它实现 Collection 接口。Queue 实现 FIFO(先进先出)。这意味着先输入的元素是先删除的元素。

11 Deque

EnumMap 类是一个专门的 Map 实现,用于枚举键。枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。

集合算法

集合框架定义了几种可应用于集合和映射的算法。这些算法在 Collections 类中定义为静态方法。

一些方法可能会抛出 **ClassCastException**(当尝试比较不相容的类型时发生)或 **UnsupportedOperationException**(当尝试修改不可修改的集合时发生)。

Collections 定义三个静态变量:EMPTY_SET、EMPTY_LIST 和 EMPTY_MAP。所有这些都是不可变的。

序号 算法和描述
1 集合算法

这是一个所有算法实现的列表。

如何使用迭代器?

通常,您需要遍历集合中的元素。例如,您可能需要显示每个元素。

最简单的方法是使用迭代器,它是一个实现 Iterator 或 ListIterator 接口的对象。

迭代器使您可以遍历集合,获取或删除元素。ListIterator 扩展 Iterator 以允许双向遍历列表和修改元素。

序号 迭代器方法和描述
1 使用 Java 迭代器

这是一个 Iterator 和 ListIterator 接口提供的所有方法的列表,并附带示例。

如何使用比较器?

TreeSet 和 TreeMap 都按排序顺序存储元素。但是,正是比较器定义了“排序顺序”的确切含义。

此接口允许我们以多种不同的方式对给定的集合进行排序。此外,此接口还可用于对任何类的任何实例进行排序(即使是我们无法修改的类)。

序号 迭代器方法和描述
1 使用 Java 比较器

这是一个 Comparator 接口提供的所有方法的列表,并附带示例。

如何使用可比较对象?

TreeSet 和 TreeMap 都按排序顺序存储元素。我们可以使用 Comparable 接口来精确定义“排序顺序”的含义。

此接口允许我们以多种不同的方式对给定的集合进行排序。此外,此接口还可用于对任何类的任何实例进行排序(即使是我们无法修改的类)。

序号 迭代器方法和描述
1 使用 Java Comparable

这是一个 Comparable 接口提供的所有方法的列表,并附带示例。

总结

Java 集合框架使程序员可以访问预打包的数据结构以及用于操作它们的方法。

集合是一个可以保存对其他对象的引用的对象。集合接口声明可以对每种类型的集合执行的操作。

集合框架的类和接口位于 java.util 包中。

广告