Java 集合框架

早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。

虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。

集合框架被设计成要满足以下几个目标。

  • 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
  • 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
  • 对一个集合的扩展和适应必须是简单的。

为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。

简化图:

1

说明:对于以上的框架图有如下几点说明

  1. 所有集合类都位于 java.util 包下。Java的集合类主要由两个接口派生而出:Collection 和 Map,Collection 和 Map 是 Java 集合框架的根接口,这两个接口又包含了一些子接口或实现类。
  2. 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
  3. 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
  4. 实现类:8个实现类(实线表示),对接口的具体实现。
  5. Collection 接口是一组允许重复的对象。
  6. Set 接口继承 Collection,集合元素不重复。
  7. List 接口继承 Collection,允许重复,维护元素插入顺序。
  8. Map接口是键-值对象,与Collection接口没有什么关系。
  9. Set、List 和 Map 可以看做集合的三大类:
    List 集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
    Set 集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。
    Map 集合中保存 Key-value 对形式的元素,访问时只能根据每项元素的 key 来访问其 value。

集合框架图如图所示:


Java 集合框架提供了一套性能优良,使用方便的接口和类,java 集合框架位于 java.util 包中, 所以当使用集合框架的时候需要进行导包。


集合接口

集合框架定义了一些接口。本节提供了每个接口的概述:

序号 接口描述
1 Collection 接口
允许你使用一组对象,是Collection层次结构的根接口。
2 List 接口
继承于Collection和一个 List实例存储一个有序集合的元素。
3 Set
继承于 Collection,是一个不包含重复元素的集合。
4 SortedSet
继承于Set保存有序的集合。
5 Map
将唯一的键映射到值。
6 Map.Entry
描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。
7 SortedMap
继承于Map,使Key保持在升序排列。
8 Enumeration
这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。

集合类

Java 提供了一套实现了 Collection 接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现。

标准集合类汇总于下表:

序号 类描述
1 AbstractCollection 
实现了大部分的集合接口。
2 AbstractList 
继承于 AbstractCollection 并且实现了大部分List接口。
3 AbstractSequentialList 
继承于  AbstractList ,提供了对数据元素的链式访问而不是随机访问。
4 LinkedList
继承于 AbstractSequentialList,实现了一个链表。
5 ArrayList
通过继承 AbstractList,实现动态数组。
6 AbstractSet 
继承于 AbstractCollection 并且实现了大部分Set接口。
7 HashSet
继承了 AbstractSet,并且使用一个哈希表。
8 LinkedHashSet
具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
9 TreeSet
继承于AbstractSet,使用元素的自然顺序对元素进行排序.
10 AbstractMap 
实现了大部分的 Map 接口。
11 HashMap
继承了 HashMap,并且使用一个哈希表。
12 TreeMap
继承了 AbstractMap,并且使用一颗树。
13 WeakHashMap
继承 AbstractMap类,使用弱密钥的哈希表。
14 LinkedHashMap
继承于 HashMap,使用元素的自然顺序对元素进行排序.
15 IdentityHashMap
继承 AbstractMap 类,比较文档时使用引用相等。

在前面的教程中已经讨论通过 java.util 包中定义的类,如下所示:

序号 类描述
1 Vector
Vector 类实现了一个动态数组。和 ArrayList 和相似,但是两者是不同的。
2 Stack
栈是 Vector 的一个子类,它实现了一个标准的后进先出的栈。
3 Dictionary
Dictionary 类是一个抽象类,用来存储键/值对,作用和 Map 类相似。
4 Hashtable
Hashtable 是原始的 java.util 的一部分, 是一个 Dictionary 具体的实现 。
5 Properties
Properties 继承于 Hashtable.表示一个持久的属性集.属性列表中每个键及其对应值都是一个字符串。
6 BitSet
一个 Bitset 类创建一种特殊类型的数组来保存位值。BitSet 中数组大小会随需要增加。

一个 Bitset 类创建一种特殊类型的数组来保存位值。BitSet 中数组大小会随需要增加。


集合算法

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

在尝试比较不兼容的类型时,一些方法能够抛出 ​ClassCastException​异常。当试图修改一个不可修改的集合时,抛出​UnsupportedOperationException​异常。

集合定义三个静态的变量:EMPTY_SET EMPTY_LIST,EMPTY_MAP 的。这些变量都不可改变。

序号 算法描述
1 Collection Algorithms
这里是一个列表中的所有算法实现。

如何使用迭代器

通常情况下,你会希望遍历一个集合中的元素。例如,显示集合中的每个元素。

做到这一点最简单的方法是采用一个迭代器,它是一个对象,实现了 Iterator 接口或 ListIterator 接口。

迭代器,使你能够通过循环来得到或删除集合的元素。ListIterator 继承了 Iterator,以允许双向遍历列表和修改元素。

这里通过实例列出 Iterator 和 listIterator 接口提供的所有方法。