Java 集合
在 Java 2 之前,Java 提供了临时类,例如 **Dictionary、Vector、Stack** 和 **Properties** 来存储和操作对象组。尽管这些类非常有用,但它们缺乏一个核心统一的主题。因此,使用 Vector 的方式与使用 Properties 的方式不同。
集合框架的设计是为了实现几个目标,例如:
该框架必须具有高性能。基本集合(动态数组、链表、树和哈希表)的实现必须高效。
该框架必须允许不同类型的集合以类似的方式工作,并具有高度的互操作性。
该框架必须能够轻松扩展和/或采用集合。
为此,整个集合框架都是围绕一组标准接口设计的。提供了这些接口的几个标准实现,例如 **LinkedList、HashSet** 和 **TreeSet**,您可以按原样使用它们,也可以根据需要实现您自己的集合。
集合框架是表示和操作集合的统一架构。所有集合框架都包含以下内容:
**接口** - 这些是表示集合的抽象数据类型。接口允许独立于其表示细节来操作集合。在面向对象的语言中,接口通常形成一个层次结构。
**实现,即类** - 这些是集合接口的具体实现。从本质上说,它们是可重用的数据结构。
**算法** - 这些是在实现集合接口的对象上执行有用计算(例如搜索和排序)的方法。据说算法是多态的:也就是说,相同的方法可以用于许多不同实现的适当集合接口。
除了集合之外,框架还定义了几个映射接口和类。映射存储键/值对。尽管映射并非集合(按术语的正确用法),但它们与集合完全集成。
集合接口
集合框架定义了几个接口。本节概述每个接口:
序号 | 接口和描述 |
---|---|
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 提供了一组实现集合接口的标准集合类。一些类提供了可以按原样使用的完整实现,而另一些类是抽象类,提供了用作创建具体集合的起点的骨架实现。
标准集合类在以下表格中进行了总结:
序号 | 类和描述 |
---|---|
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、AbstractSequentialList 和 AbstractMap 类提供了核心集合接口的骨架实现,以最大限度地减少实现它们的所需工作量。
前面章节讨论了 java.util 定义的以下遗留类:
序号 | 类和描述 |
---|---|
1 | Vector 这实现了动态数组。它类似于 ArrayList,但有一些区别。 |
2 | Stack 栈是 Vector 的一个子类,它实现了标准的后进先出栈。 |
3 | Dictionary Dictionary 是一个抽象类,它表示键/值存储库,其操作方式与 Map 非常相似。 |
4 | Hashtable Hashtable 是最初的 java.util 的一部分,是 Dictionary 的具体实现。 |
5 | Properties Property 是 Hashtable 的子类。它用于维护值列表,其中键是字符串,值也是字符串。 |
6 | BitSet BitSet 类创建一个特殊类型的数组,该数组保存位值。此数组可以根据需要增加大小。 |
集合算法
集合框架定义了几个可以应用于集合和映射的算法。这些算法在 Collections 类中定义为静态方法。
一些方法可能会抛出 **ClassCastException**(当尝试比较不兼容的类型时发生)或 **UnsupportedOperationException**(当尝试修改不可修改的集合时发生)。
Collections 定义三个静态变量:EMPTY_SET、EMPTY_LIST 和 EMPTY_MAP。所有这些都是不可变的。
序号 | 算法和描述 |
---|---|
1 | 集合算法 以下是所有算法实现的列表。 |
如何使用迭代器?
通常,您需要遍历集合中的元素。例如,您可能想要显示每个元素。
最简单的方法是使用迭代器,迭代器是实现 Iterator 或 ListIterator 接口的对象。
Iterator 使您可以遍历集合,获取或删除元素。ListIterator 扩展 Iterator 以允许双向遍历列表和修改元素。
序号 | Iterator 方法和描述 |
---|---|
1 | 使用 Java 迭代器 以下是 Iterator 和 ListIterator 接口提供的所有方法及其示例的列表。 |
如何使用比较器?
TreeSet 和 TreeMap 都按排序顺序存储元素。但是,正是比较器定义了“排序顺序”的确切含义。
此接口允许我们以任意多种不同的方式对给定的集合进行排序。此外,此接口可用于对任何类的任何实例进行排序(甚至是无法修改的类)。
序号 | Iterator 方法和描述 |
---|---|
1 | 使用 Java 比较器 以下是 Comparator 接口提供的所有方法及其示例的列表。 |
总结
Java 集合框架使程序员可以访问预打包的数据结构以及用于操作它们算法。
集合是一个可以保存其他对象引用的对象。集合接口声明了可以对每种类型的集合执行的操作。
集合框架的类和接口位于java.util包中。