# 集合框架概述

## 0x00、 [集合框架概述](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/doc-files/coll-overview.html)

## 0x01、 介绍

Java 平台包含一个集合框架。 一个集合是一个对象，它表示了一个对象组(例如 ArrayList 类) 。 集合框架是一个用于表示和操纵集合的统一的结构，使集合的操纵能独立于实现细节。

集合框架的主要优势在于：

* **节省编程精力** 它提供了数据结构和算法，所以你无需自己实现他们。
* **增加效率** 通过提供对数据结构和算法的高新能实现提升效率。

  &#x20; 因为各个接口的实现是通用的，开发者可以选择实现方式。
* **允许不相关API之间的互操作** 通过一种通用语言来回传递集合。
* **降低学习API的成本** 通过学习要求您学习多个常用集合 API 来降低你学习 API 所需的成本。
* **降低你设计和实现 API 的成本** 用它们就好。
* **快速软件重用** 你操作标准的集合接口和算法能提高软件(代码)的复用性。

集合框架由下列内容组成：

* **集合接口** 代表不同类型的集合，例如 set、list、map 。这些接口是集合框架的基础。
* **通用 implement** 主要实现集合接口。
* **遗留 implement** 对较早发布的 Vector 和 Hashtable 进行了实现集合接口的改装。
* **特殊目的的 implementat** 实现设计用于特别的情况。

  &#x20; 这些实现展示了非标准的性能特征使用限制或者行为。
* **并发 implement** 设计用于应对高并发的实现。
* **包装 implement** 增加功能，例如同步。
* **方便的 implement** 集合接口的高性能迷你实现。
* **抽象 implement** 集合接口的部分实现有助于自定义实现。
* **算法** 静态方法执行常用的功能，例如排序列表。
* **数组程序** 用于基本类型和引用对象数组的实用程序函数。 严格来说，不是集合框架的一部分，此功能在集合框架的同时添加到Java平台，并依赖于某些相同的基础结构。

## 0x02、 集合接口

集合接口被分配在两个组中。 最基础的接口，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)。 在文档中必须明确标示哪一个操作是被支持的。 一些术语在这种情况下被引入。

* 集合不支持操作选项(例如 add,remove,clear)的时候会被 *unmodifiable(不可修改的)*&#x63CF;述。 当集合是非 *unmodifiable* 的时候就是 *modifiable* 的。
* 保证其中对象不可以改变的集合将会被 *immutable(不可变)* 描述。 当集合是非 *immutable* 的时候就是 *mutable* 的。
* 对于 List 即使其中的元素可以改变，只要保证保集合自身长度不随着其内容的变化而变化被描述为 *fixed-size(固定大小)* 非 *fixed-size* 即 *variable-size(可变大小)*
* List 支持快速(通常指常数时间)的索引元素访问被描述为 *random access(随机访问)*&#x5217;表。 不支持款速索引元素访问的被称为 *sequential access(顺序访问)* 列表。 `RandomAccess` 标记接口允许列表公开他们随机访问的事实。 启用通用算法改变他们的行为提供好的性能这件事适用于任何随机或者顺序访问列表。
