Collection(下称"对象集") 指一个能够表示一组对象的对象(比如数组)。Java 平台提供了一个 Collections 框架,它是一个统一的架构,用来表示和处理对象集,同时又对每一个具体的对象集做了很多实现上的算法优化。
Collections 框架的主要优点有:
- 降低编程成本:这些数据结构和算法都已经摆在那里,你就不用自己实现了。
- 提升性能:提供的数据结构和算法实现都是高性能的。每个接口内部都提供了多种可以互相替代的实现,程序可以通过替换实现来进行性能调优。
- 提供了无关 API 间的内部交互:建立了一个通用的语义,给 API 传入和传出对象集。
- 更容易学习 API:你不需要学习一些特别的对象集 API。
- 更容易设计和实现 API:你不需要设计和实现一些特别的对象集 API.
- 促进软件复用:框架提供了标准的接口和实现,这本身就是很好的软件复用。
Collections 框架由以下部分组成:
- 对象集接口:表示不同的对象集类型,比如集合(set)、列表(list)、映射(map)等,这些接口形成了框架的基础。
- 通用实现:对象集接口的基本实现。
- 早期实现:一些像 Vector 和 Hashtable 这样在早期 java 版本中就提供的对象集实现,在当前版本也实现了对应的对象集接口。
- 特别目的的实现:适用于特定场景的实现,这些实现带来了特别的性能体验,但也包含一些使用限制和特殊的行为表现。
- 并发实现:为高并发用途而设计的实现。
- 封装实现:对其他实现添加了额外的功能,比如说同步功能。
- 传统实现:高性能的对象集“最小实现”。???
- 抽象实现:为了方便定制实现,实现一部分对象集接口。
- 算法:一组静态方法,提供用于对象集上的有用操作,比如列表的排序。
- 数组工具:用于操作原始类型数据或是引用对象数组的工具函数。不严格地说,这也是 Collections 框架的一部分,这个特性是跟 Collections 框架同步发布的,底层也用了一些共同基础逻辑。
对象集接口
对象集接口主要分为两大类:java.util.Collection 和 java.util.Map
java.util.Collection 的子接口包括:
- java.util.Set
- java.util.SortedSet
- java.util.NavigableSet
- java.util.Queue
- java.util.concurrent.BlockingQueue
BlockingQueue 处理生产者-消费者模式的多线程模型是一把好手。
- java.util.concurrent.TransferQueue
- java.util.Deque
- java.util.concurrent.BlockingDeque
java.util.Map 的子接口包括:
- java.util.SortedMap
- java.util.NavigableMap
- java.util.concurrent.ConcurrentMap
在 Map 基础上提供了一些像 putIfAbsent 这样的原子方法
- java.util.concurrent.ConcurrentNavigableMap
上述接口中有很多方法被标注为可选的(optional),这意味着允许具体的实现类不实现这些方法,被调用到的时候直接抛出一个 UnsupportedOperationException 异常。
通用实现
下面这个表格总结了 Collections 框架中的通用实现类。
接口
|
HashTable
|
Resiable Array
|
Balanced Tree
|
Linked List
|
Hash Table
+ LinkedList
|
Set
|
HashSet
|
| TreeSet |
|
LinkedHashSet
|
List
|
|
ArrayList
|
|
LinkedList
|
|
Deque
|
|
ArrayDeque
|
|
LinkedList
|
|
Map
|
HashMap
|
| TreeMap |
|
LinkedHashMap
|
上述的通用实现类都实现了所有的可选操作,对他们装填的元素也没有任何限制。值得注意的是它们都不是线程安全的,另外所有新的实现都有 fail-fast 迭代器,就是在迭代的时候如果检测到容器结构被修改了,就抛出 ConcurrentModificationException 异常。
支持并发的对象集
在并发程序中使用对象集需要非常小心,好在 Collections 框架提供了多种对并发访问友好的 API,这些类型比同步的封装类好用多了。
支持并发的接口如下:
- BlockingQueue
- TransferQueue
- BlockingDeque
- ConcurrentMap
- ConcurrentNavigableMap
对应的实现类如下:
- LinkedBlockingQueue
- ArrayBlockingQueue
- PriorityBlockingQueue
- DelayQueue
- SynchronousQueue
- LinkedBlockingDeque
- LinkedTransferQueue
- CopyOnWriteArrayList
- CopyOnWriteArraySet
- ConcurrentSkipListSet
- ConcurrentHashMap
- ConcurrentSkipListMap
设计哲学
主要的设计目标是产生一个小而精的对象集 API。
为了做到接口数量足够小,对于像可变性、可修改性这样的不同细节,不是通过多个接口来区分,而是通过接口的可选方法来实现。
为了让接口内部的方法足够少,这些方法必须满足下面的某个条件:
- 真的是一个基础操作
- 一些特别高效的实现,覆写了该方法后可以达到显著的性能提升