集合
Java集合框架是指导Java的集合类。Collection 接口是一组允许重复的对象。Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。 List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。
—— wiki

Collection接口继承了Iterable接口ListQueueSet接口继承了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