集合
Java集合框架是指导Java的集合类。Collection 接口是一组允许重复的对象。Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。 List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。
—— wiki
Collection
接口继承了Iterable
接口List
Queue
Set
接口继承了Collection
接口
List
List
接口继承了Collection
接口- 表示一个有序集合(有序序列), 所有元素通过插入产生, 可以通过数字索引查找
- 允许重复元素
Vector
List
的一种基于可变数组的实现- 允许所有的元素, 包括
null
- 与
ArrayList
大致相同, 除了它是同步的, 在单线程环境下优先使用ArrayList
- 特点是: 线程安全(同步), 查找速度快(可按索引), 添加和删除速度较慢( 相对
LinkedList
) - 当
capacity
(容量) 不足时候自动进行扩容, 为原来2倍(可定制) - 通过预先确定容量可以节省扩容消耗的时间
fail-fast
机制避免遍历时列表被修改(会抛出异常ConcurrentModificationException
)- 不能过分依赖
fail-fast
机制, 只能充当一份基本的保障, 用来查找bug - 遍历优先使用
forEach
方法 - 当需要在遍历时候添加或者删除元素时, 使用
ListIterator
ArrayList
List
的一种基于可变数组的实现- 允许所有的元素, 包括
null
- 与
Vector
大致相同, 除了它是非同步的 - 特点是: 非线程安全(非同步), 查找速度快(可按索引), 添加和删除速度较慢( 相对
LinkedList
) - 当
capacity
(容量) 不足时候自动进行扩容, 为原来1.5倍 - 通过预先确定容量可以节省扩容消耗的时间
fail-fast
机制避免遍历时列表被修改(会抛出异常ConcurrentModificationException
)- 不能过分依赖
fail-fast
机制, 只能充当一份基本的保障, 用来查找bug - 遍历优先使用
forEach
方法 - 当需要在遍历时候添加或者删除元素时, 使用
ListIterator
LinkedList
List
的一种基于双向链表的实现- 允许所有的元素, 包括
null
- 特点是: 非线程安全(非同步), 查找速度慢(需要遍历), 添加和删除速度快(相对
ArrayList
不需要数组拷贝) fail-fast
机制避免遍历时列表被修改(会抛出异常ConcurrentModificationException
)- 不能过分依赖
fail-fast
机制, 只能充当一份基本的保障, 用来查找bug - 遍历优先使用
forEach
方法 - 当需要在遍历时候添加或者删除元素时, 使用
ListIterator
Queue
Queue
接口继承了Collection
接口- 表示一个有优先级的队列
- 部分队列有容量的限制, 大部分则没有限制(即插入操作不会失败)
- 一般队列是FIFO (first-in-first-out)方式的
- 优先队列(PriorityQueue) 通过比较来排列元素顺序
- 没有定义非阻塞队列方法, 非阻塞队列接口为
BlockingQueue
- 通常不允许添加
null
元素,LinkedList
允许, 但最好不要, 因为null
常常用来作为特殊的返回值 - 队列的实现类通常没有实现基于元素的
equals
和hashCode
方法, 因为即使队列元素相同, 队列顺序也常常不同
功能 | 抛出异常 | 返回特殊值(如null 或者false ) |
---|---|---|
添加元素 | add(e) | offer(e) |
获取并删除队列头部元素 | remove() | poll() |
获取队列头部元素 | element() | peek() |
LinkedList
Dqueue
(双端队列)/Queue
(队列)的一种基于双向链表的实现- 也可以用作栈, 即 LIFO (last-in-first-out)
- 允许所有的元素, 包括
null
, 但是不建议 - 特点是: 非线程安全(非同步), 可充当队列或者栈, 无容量限制
PriorityQueue
- 继承自
AbstractQueue
, 是优先级队列的一种实现 (小顶堆) - 不允许
null
元素 - 无外部容量限制, 内部容量限制为数组最大容量
- 特点是: 非线程安全(非同步), 可自定义优先级(比较规则)
- 容量不足时自动扩容, 若原容量小于64则扩容为原来2倍加2, 否则扩容为原来1.5倍
Set
Set
接口继承了Collection
接口- 存储一组不重复的元素, 他们之间都是不相等的(通过
equals
方法判断) - 最多存储一个
null
元素 - 虽然没有禁止, 但是如果保存可变元素, 可能会破坏
Set
的不重复特性 - 一般来说, 禁止保存自身作为元素
Set
接口的实现类可以选择对元素进行限制
HashSet
- 基于
HashMap
实现 - 允许
null
元素 - 无序, 非同步
LinkedHashSet
- 基于
LinkedHashMap
实现, 继承了HashSet
- 允许
null
元素 - 有序, 非同步
- 相同元素重复插入时, 顺序不变
TreeSet
- 通常情况下基于
TreeMap
实现, 实现了NavigableSet
接口 - 不允许
null
元素 - 有序, 非同步
- 相同元素重复插入时, 顺序不变
Map
- 一种用户保存键值对映射的数据结构
- 不可保存重复的键值
- 每个键可以映射最多一个值
- 取代了类
Dictionary
- 提供了三种视图(view): 键视图/值视图/键值对视图
- 警惕可变类作为map的键的情况, 可能导致键值对不可达
- 一般不允许自引用
Hashtable
- 继承了
Dictionary<K,V>
, 实现了Map<K,V>
非null
的对象可以作为键或者值- 线程安全, 有序
- 键必须要实现
hashCode
和equals
方法 initial capacity
(初始容量) 和load factor
(负载因子, 默认0.75) 影响其性能- 扩容时是原来的两倍+1
fail-fast
机制避免了在iterator
(遍历)过程中对Hashtable进行操作, 若发生操作则抛出ConcurrentModificationException
异常- 不能过分依赖
fail-fast
机制, 只能充当一份基本的保障, 用来查找bug Hashtable
是同步的, 现在版本已不推荐使用. 需要线程安全可以使用ConcurrentHashMap
, 不需要线程安全可以使用HashMap
HashMap
- 继承了
AbstractMap<K,V>
, 实现了Map<K,V>
- 允许
null
作为键或者值 - 非线程安全, 无序
- 除了允许
null
和非同步外和Hashtable
比较类似 initial capacity
(初始容量, 默认16) 和load factor
(负载因子, 默认0.75) 影响其性能- 扩容时是原来的两倍
fail-fast
机制避免了在iterator
(遍历)过程中对HashMap进行操作, 若发生操作则抛出ConcurrentModificationException
异常- 不能过分依赖
fail-fast
机制, 只能充当一份基本的保障, 用来查找bug
LinkedHashMap
- 继承了
HashMap<K,V>
, 实现了Map<K,V>
- 允许
null
作为键或者值 - 非线程安全, 有序
- 它比
HashMap
多记录了插入键值对的顺序(使用双向链表, 可以改为访问顺序), 重复插入同个键不影响顺序 initial capacity
(初始容量, 默认16) 和load factor
(负载因子, 默认0.75) 影响其性能- 扩容时是原来的两倍
fail-fast
机制避免了在iterator
(遍历)过程中对LinkedHashMap进行操作, 若发生操作则抛出ConcurrentModificationException
异常- 不能过分依赖
fail-fast
机制, 只能充当一份基本的保障, 用来查找bug - 因为维持了双向链表, 所以遍历性能比
HashMap
高
TreeMap
- 继承了
AbstractMap<K,V>
, 实现了NavigableMap<K,V>
- 基于红黑树实现,通过键的比较方法(compareTo)或者比较器(Comparator)进行排序,开销是log(n)
- 不允许
null
作为键或者值 - 非线程安全, 有序
- 插入后不应该再修改该键
fail-fast
机制避免了在iterator
(遍历)过程中对TreeMap进行操作, 若发生操作则抛出ConcurrentModificationException
异常- 不能过分依赖
fail-fast
机制, 只能充当一份基本的保障, 用来查找bug
Utils
JDK 提供了一些工具类用来方便地操作集合和数组
Arrays
包含许多操作数组的静态方法
sort
方法用来对数组进行排序parallelSort
方法用来对数组进行并行排序binarySearch
方法用来二分查找数组中的元素equals
用来比较两个数组的内容fill
用来往数组中填充内容copyOf
用来复制数组asList
用来将数组转化成ArrayListhashCode
用来计算数组的hash值toString
用来将数组转化成字符串
Collections
包含许多操作集合的静态方法
sort
方法用来对List进行排序binarySearch
方法用来对List进行二分查找reverse
方法用来对List进行顺序反转操作shuffle
方法用来对List进行随机排列swap
方法用来交换List中两个元素fill
方法用来对List进行填充copy
方法用来拷贝Listmin
方法用来获取集合中的最小值max
方法用来获取集合中的最大值replaceAll
方法用来对List中的某一值进行替换unmodifiableList
方法用来包装List以获得一个不可变的ListsynchronizedList
方法用来包装List以获得一个线程安全的ListemptyList
方法用来获得一个不可变的空ListsingletonList
方法用来获得一个单值的List