Java 集合框架概览
简介(Introduction)
jdk中包含了一个集合框架 (collections framework),定义了表示和操作集合的统一方式。集合本身也是对象,但常常用来表示一组其他的对象。
统一的集合框架会带来以下好处:
- 不需要重新设计、实现数据结构和算法
- 框架包含性能良好的数据结构和算法实现
- 框架定义了统一的集合表示方式,为不同的API提供了互操作性
- 不需要学习多套集合API,降低了学习成本
- 代码复用
集合框架由以下部分组成:
- 集合接口(collection interfaces)
- 通用实现(general-purpose implementations)
- 旧API的新实现(legacy implementations)
- 特定实现(special-purpose implementations)
- 并发实现(concurrent implementations)
- 包装实现(wrapper implementations)
- 简单实现(convenience implementations)
- 抽象实现(abstract implementations)
- 集合相关算法(algorithms)
- 基础接口(infrastructure)
- 数组相关工具类(array utilities)
集合接口(Collection Interfaces)
集合接口分为两组。java.util.Collection是最基础的接口,有如下派生接口:
- java.util.Set
- java.util.SortedSet
- java.util.NavigableSet
- java.util.Queue
- java.util.concurrent.BlockingQueue
- java.util.concurrent.TransferQueue
- java.util.Deque
- java.util.concurrent.BlockingDeque
其他的集合接口基于java.util.Map,并不是真正意义上的集合,但是,这些接口中包含集合视图操作,可以支持集合的相关操作。Map有如下派生接口:
- java.util.SortedMap
- java.util.NavigableMap
- java.util.concurrent.ConcurrentMap
- java.util.concurrent.ConcurrentNavigableMap
集合接口定义的很多修改集合的方法,可以选择性实现,如果具体的实现不支持某种操作,使用时会抛出UnsupportedOperationException,具体可参考特定实现的文档。集合框架规范中做了如下约定:
- 不可修改(unmodifiable)。集合不支持修改操作,如add,remove, clear
- 不可变(immutable)。集合不支持修改操作,并保证Collection对象的改变不可见
- 固定大小(fix-sized)。列表元素个数不变,元素可以改变
- 随机接入(random access)。列表支持快速访问元素,访问时间一般是常量
集合实现(Collection Implementations)
实现集合接口的类通常命名为<Implementation-style><Interface>。下表总结了集合接口的通用实现
Interface | Hash Table | Resizable Array | Balanced Tree | Linked List | Hash Table + Linked List |
---|---|---|---|---|---|
Set | HashSet | TreeSet | LinkedHashSet | ||
List | ArrayList | LinkedList | |||
Deque | ArrayDeque | LinkedList | |||
Map | HashMap | TreeMap | LinkedHashMap |
通用的集合实现支持集合接口中的所有可选操作,不限制集合所能包含的元素,并且是非同步的(unsynchronized),Collections类包含了静态工厂方法,能够将很多非同步集合包装为同步集合,新实现集合的迭代器检测到非法并发修改时,都会快速停止迭代(fail-fast)。
JDK中的AbstractCollection,AbstractSet,AbstractList, AbstractSuquentialList和AbstractMap类提供了核心集合接口的基本实现,降低了自定义实现的难度。具体可参考对应抽象集合类的文档,自定义实现时,选择性的覆盖其中的一些方法。
并发集合(Concurrent Collections)
集合经常会在并发编程(concurrent programming)中使用,集合框架中包含了很多并发集合接口和实现。
并发集合接口
- BlockingQueue
- TransferQueue
- BlockingDeque
- ConcurrentMap
- ConcurrentNavigableMap
并发集合实现,具体用法参考JDK的API文档
- LinkedBlockingQueue
- ArrayBlockingQueue
- PriorityBlockingQueue
- DelayQueue
- SynchronousQueue
- LinkedBlockingDeque
- LinkedTransferQueue
- CopyOnWriteArrayList
- CopyOnWriteArraySet
- ConcurrentSkipListSet
- ConcurrentSkipListMap
- ConcurrentHashMap
设计目标(Design Goals)
集合框架的主要设计目标是形成一套在代码量和概念上足够轻量的API。其中很重要的一点是,新特性的引入不会给现有的API使用者增加负担,做增量修改,而不是替代。另外,新的API需要功能足够强大,满足不同场景下的使用需求。
为了保持接口中方法数量足够少,核心接口不会定义集合的可变性(mutability)、可修改性(modifiability)、大小可变化性(resizability)等,而是将其作为可选操作,具体的实现通过抛出UnsupportedOperationException异常表明不支持某项操作,
核心接口只会在下面的情况中定义新的方法:
- 基础操作(fundamental operation)
- 接口可以提供最佳实现
框架还提供了一些方法,使集合可以转换为数组,数组可以提供集合视图,哈希可以提供集合视图等