Java 集合框架
在Java 2之前,Java提供了一些临时的类,例如 Dictionary、Vector、Stack, 和 Properties 来存储和操作对象的群组。尽管这些类非常有用,但它们缺乏一个统一的主题。因此,你使用Vector的方式与你使用Properties的方式是不同的。
集合框架的设计目标有几个,例如:
- 框架必须具有高性能。基本集合(动态数组、链表、树和哈希表)的实现必须非常高效。
-
框架必须允许不同类型的集合以类似的方式工作,并具有高度的互操作性。
-
框架必须易于扩展和/或适应集合。
为了实现这个目标,整个集合框架都围绕一组标准接口设计。提供了几个标准实现,例如 LinkedList、HashSet, 和 TreeSet ,你可以直接使用,也可以根据需要实现自己的集合。
集合框架是一种统一的架构,用于表示和操作集合。所有集合框架都包含以下内容:
- 接口 - 这些是表示集合的抽象数据类型。接口允许独立于其表示细节来操作集合。在面向对象的语言中,接口通常构成一个层次结构。
-
实现,即类 - 这些是集合接口的具体实现。实际上,它们是可重用的数据结构。
-
算法 - 这些是在实现集合接口的对象上执行有用计算的方法,例如搜索和排序。这些算法被称为多态的:也就是说,可以在适当的集合接口的许多不同实现上使用相同的方法。
除了集合,该框架还定义了几个映射接口和类。映射存储键/值对。虽然映射在术语的适当使用中并不是集合,但它们与集合完全集成。
集合接口
集合框架定义了几个接口。本节概述了每个接口的内容−
序号 | 接口及说明 |
---|---|
1 | 集合接口 这使您能够处理对象组;它位于集合层次结构的顶部。 |
2 | 列表接口 这扩展自 集合 ,List的实例存储着有序的元素集合。 |
3 | 集合接口 这扩展至Collection以处理必须包含唯一元素的集合。 |
4 | 排序集合接口 这扩展Set以处理排序集合。 |
5 | 映射接口 这将唯一的键映射到值。 |
6 | 映射元素 这描述了映射中的一个元素(键/值对)。这是Map的内部类。 |
7 | 排序映射接口 这扩展Map以保持键以升序排列。 |
8 | 枚举接口 这是一个旧的接口,定义了一种方法,可以枚举(逐个获取)对象集合中的元素。这个旧接口已经被迭代器(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定义的以下旧版类 –
Sr.No. | 类别与描述 |
---|---|
1 | Vector 这个类实现了一个动态数组。它与ArrayList类似,但有一些区别。 |
2 | Stack Stack是Vector的子类,实现了标准的后进先出堆栈。 |
3 | Dictionary Dictionary是一个抽象类,表示一个键/值存储库,操作方式与Map类似。 |
4 | Hashtable Hashtable是java.util的一部分,是Dictionary的具体实现。 |
5 | Properties Properties是Hashtable的子类。它用于维护键是字符串、值也是字符串的值列表。 |
6 | BitSet BitSet类创建了一个特殊类型的数组,用于存储位值。这个数组可以根据需要增加大小。 |
集合算法
集合框架定义了可以应用于集合和映射的几个算法。这些算法被定义为Collections类中的静态方法。
其中一些方法可能会抛出ClassCastException异常,当试图比较不兼容的类型时出现;或者抛出UnsupportedOperationException异常,当试图修改一个不可修改的集合时出现。
Collections定义了三个静态变量: EMPTY_SET, EMPTY_LIST和EMPTY_MAP。它们都是不可变的。
编号 | 算法 & 描述 |
---|---|
1 | 集合算法 这是所有算法实现的列表。 |
如何使用迭代器
通常,您希望循环遍历集合中的元素。例如,您可能希望显示每个元素。
最简单的方法是使用迭代器,它是实现Iterator或ListIterator接口的对象。
迭代器使您可以循环遍历集合,获取或删除元素。ListIterator扩展Iterator以允许对列表进行双向遍历和修改元素。
序号 | 迭代器方法和说明 |
---|---|
1 | 使用Java迭代器 这是迭代器和列表迭代器接口提供的所有方法的列表和示例。 |
如何使用比较器
TreeSet和TreeMap都以排序的方式存储元素。然而,正是比较器定义了精确的排序顺序。
这个接口允许我们以多种不同的方式对给定的集合进行排序。此外,此接口还可以用来对任何类的任何实例排序(甚至是我们无法修改的类)。
序号 | 迭代器方法及说明 |
---|---|
1 | 使用Java比较器 这里是由比较器接口提供的所有方法及示例的列表。 |
概述
Java的集合框架为程序员提供了预先打包好的数据结构以及操作它们的算法。
集合是可以持有其他对象的对象。集合接口声明了可以在每种类型的集合上执行的操作。
集合框架的类和接口位于java.util包中。