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 提供了一组标准的集合类,这些类实现了 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、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 接口的对象。
迭代器使您能够遍历集合,获取或删除元素。ListIterator 扩展了 Iterator 以允许双向遍历列表和修改元素。
序号 | 迭代器方法及描述 |
---|---|
1 | 使用 Java 迭代器 以下是 Iterator 和 ListIterator 接口提供的所有方法及其示例的列表。 |
如何使用比较器?
TreeSet 和 TreeMap 都以排序顺序存储元素。但是,正是比较器定义了“排序顺序”的确切含义。
此接口允许我们以任意多种不同的方式对给定集合进行排序。此外,此接口可用于对任何类的任何实例进行排序(即使是我们无法修改的类)。
序号 | 迭代器方法及描述 |
---|---|
1 | 使用 Java 比较器 以下是 Comparator 接口提供的所有方法及其示例的列表。 |
总结
Java 集合框架使程序员能够访问预打包的数据结构以及用于操作它们算法。
集合是可以保存对其他对象的引用的对象。集合接口声明可以在每种类型的集合上执行的操作。
集合框架的类和接口位于 java.util 包中。