主要参考 Collections Framework Overview 这个文档.
如有错误, 恳请指正, 不胜感激😘.
1 简介
集合是一个 表示一组对象 的对象(A collection is an object that represents a group of objects).
Java 平台包含一个 集合框架(collections framework).
集合框架 是一个 表示和操作集合的 统一体系结构(unified architecture), 使集合能够独立于实现细节进行操作.
集合框架 的主要优点 有:
- 减少编程工作量(Reduces programming effort)
- 提高性能(Increases performance)
- 在不相关的 API 之间 提供互操作性(Provides interoperability between unrelated APIs)
- 减少 学习 API 所需的 工作量(Reduces the effort required to learn APIs)
- 减少 设计和实现 API 所需的 工作量(Reduces the effort required to design and implement APIs)
- 促进软件复用(fosters software reuse).
collections framework 的组成:
- 集合接口(Collection interfaces), 表示不同类型的集合, 比如
Set
,List
和Map
, 这些接口是框架的基础. - 通用实现(General-purpose implementations), 集合接口的主要实现.
- 遗留实现(Legacy implementations), 对老版本的集合类
Vector
和Hashtable
进行改装(retrofit), 以实现集合接口. - 特殊实现(Special-purpose implementations), 为满足特殊情况使用而设计的实现. 这些实现展示非标准的性能特征(nonstandard performance characteristics), 使用限制 或 行为.
- 并发实现(Concurrent implementations).
- 包装器实现(Wrapper implementations), 主要提供 synchronization 功能.
- 便利实现(Convenience implementations).
- 抽象实现(Abstract implementations), 集合接口的部分实现, 以方便自定义实现集合接口.
- 算法(Algorithms), 执行集合功能的静态方法, 比如排序.
- 基础设施(Infrastructure), 为 集合接口 提供基本支持的接口.
- 数组实用程序(Array Utilities), 用于 基本类型(primitive type) 和 引用对象 的 utility 方法. 严格来说, 这不属于集合框架, 只是这个功能和集合框架同时被添加到Java平台并且依赖于一些相同的基础设施.
2 集合接口(Collection Interfaces)
集合接口 被分为两组: java.util.Collection
和 java.util.Map
.
Map
不是真正意义上的集合. 但是有一些接口包含集合视图操作(collection-view operations), 这使得 Map
可以像集合一样被操作.
集合接口中的许多修改方法(modification methods) 都被标记为 optional. 允许接口实现不提供这些方法的实现, 如果尝试使用这些操作 将会 引发运行时异常 UnsupportdOperationException
. 每个实现的文档必须指定支持哪些 可选操作(optional operations). 本规范中引入几个术语:
- 不支持修改操作(比如
add
,remove
,clear
) 的集合 被称为 unmodifiable, 相反就是 modifiable.(我的理解是: unmodifiableA(modifiableA), unmodifiableA不可更改, 但是 modifiableA 可以更改, modifiableA 改变会导致 unmodifiableA 改变) Collection
对象的所有更改都不可见 的集合 被称为 immutable, 相反就是 mutable. google guava 包里的ImmutableList
提供了比Collections.unmodifiableCollection
更强的保证. (immutable 不是包装一个集合, 所以 immutable 集合比 modifiable 更能保证集合的内容不变, 注意: 集合的内容不变指引用不变, 集合内的元素还是是可以变的)size
保持不变的列表(尽管元素可以改变) 被称为 fixed-size, 相反就是 variable-size.- 支持索引访问元素 的列表 被称为 random access lists, 不支持索引访问元素的 列表 被称为
sequential access lists.
一些实现限制了什么元素(对于 Map
就是 keys 和 values)可以被存储. 可能的限制包含下面这些:
- 属于一个特定类型(particular type)
- 不为
null
. - Obey some arbitrary predicate. (备注: 没明白这是啥限制, 翻译不出来…)
3 集合实现(Collection Implementations)
实现集合接口的类 一般的命名形式是 Implementation_style + Interface
. 下表总结了 通用实现(general purpose implementations):
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 |
通用实现支持 集合接口中的 所有 optional 操作 并且 它们所包含的元素没有限制.
这些实现都是 不同步的(unsynchronized).
AbstractCollection
, AbstractSet
, AbstractList
, AbstractSequentialList
和 AbstractMap
类提供了核心集合接口的基本实现, 以最小化实现这些接口所需的工作量.
4 并发集合(Concurrent Collections)
通过多个线程使用集合的应用程序 必须仔细编程. 通常, 这被称为 并发编程(concurrent programming).
Java 平台包含对并发编程的广泛支持.
See Java Concurrency Utilities for details.
集合的使用非常频繁, API中包含了各种并发友好的 集合接口 和 集合实现. 这些类型 提供了并发编程中常用的功能, 超越了 前面提到的并发包装器(synchronization wrappers).
如下, 可用的并发接口(concurrent-aware interfaces):
如下, 可用的并发实现类(concurrent-aware implementation classes):