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