Git
程序员面试资料大全|各种技术书籍等资料-1000G
Java集合类 Collection接口 Map接口 List接口 Set接口 Queue/Deque接口 ArrayList
底层: 动态数组 LinkedList
底层: 双向链表 Vector
底层: 动态数组 HashSet
底层: HashMap
Value为常量对象 LinkedHashSet
底层: LinkedHashMap TreeSet
底层: TreeMap PriorityQueue
底层: 数组实现的堆 ArrayDeque
底层: 循环数组 HashMap
JDK8+: 数组+链表/红黑树 LinkedHashMap
继承HashMap, 加双向链表保序 TreeMap
底层: 红黑树 Hashtable
底层: 数组+链表 ConcurrentHashMap
JDK8+: 数组+链表/红黑树
CAS + synchronized
详细解析
一、Collection 系列
1. List (有序、可重复)
-
ArrayList
:- 底层 :动态数组 (
Object[] elementData
) - 特点 :随机访问快(
O(1)
),尾部插入快;但在中间插入或删除元素时,需要移动后续所有元素,效率低(O(n)
)。需要扩容。
- 底层 :动态数组 (
-
LinkedList
:- 底层 :双向链表
- 特点 :由一系列节点通过指针连接而成。每个节点(
Node<E>
)包含实际元素(item
)、指向前一个节点的引用(prev
)和指向后一个节点的引用(next
)。 - 特点 :插入和删除快(
O(1)
),只需要修改指针;但随机访问慢(O(n)
),需要从头或尾遍历。
-
Vector
:- 底层 :和
ArrayList
一样,也是动态数组。 - 特点 :它是线程安全 的(几乎所有方法都用
synchronized
修饰),但因此性能较差。现在已很少使用,通常用Collections.synchronizedList
或CopyOnWriteArrayList
替代。
- 底层 :和
2. Set (无序、不可重复)
Set 的底层实现基本都是基于对应的 Map,其元素就是 Map 的 Key,而 Value 则是一个统一的 PRESENT
常量对象。
-
HashSet
:- 底层 :基于
HashMap
实现。 - 特点 :无序,允许一个
null
元素。查询效率非常高(O(1)
)。
- 底层 :基于
-
LinkedHashSet
:- 底层 :继承自
HashSet
,但内部通过LinkedHashMap
实现。 - 特点 :既保证了元素的唯一性,又维护了元素的插入顺序。
- 底层 :继承自
-
TreeSet
:- 底层 :基于
TreeMap
(红黑树)实现。 - 特点 :元素可以按照自然顺序或者自定义的比较器(
Comparator
)进行排序。
- 底层 :基于
3. Queue/Deque (队列)
PriorityQueue
:- 底层 :基于数组实现的二叉堆(通常是小顶堆)。
- 特点:元素根据优先级出队,而不是插入顺序。
ArrayDeque
:- 底层 :循环数组。
- 特点 :作为栈或队列使用时,性能通常优于
Stack
和LinkedList
。
二、Map 系列 (键值对)
-
HashMap
(最常用):- JDK 1.7 底层 :数组 + 链表
- JDK 1.8+ 底层 :数组 + 链表 / 红黑树
- 当链表长度超过阈值(默认为8)时,会将链表转换为红黑树 ,以提高查询效率(
O(log n)
)。 - 当红黑树节点数小于阈值(默认为6)时,会退化为链表。
- 当链表长度超过阈值(默认为8)时,会将链表转换为红黑树 ,以提高查询效率(
- 特点 :允许
null
key 和null
value,无序,非线程安全。
-
LinkedHashMap
:- 底层 :继承自
HashMap
,在其数组+链表/红黑树 的基础上,额外维护了一个双向链表来记录元素的插入顺序或访问顺序。 - 特点 :可以保持元素的插入顺序 或实现 LRU(最近最少使用) 缓存。
- 底层 :继承自
-
TreeMap
:- 底层 :红黑树
- 特点 :Key 可以根据自然顺序或比较器进行排序。
-
Hashtable
:- 底层 :和 JDK7 的
HashMap
类似,是数组+链表。 - 特点 :线程安全 (方法用
synchronized
修饰),但性能差。不允许null
key 和 value。是遗留类,不推荐使用。
- 底层 :和 JDK7 的
-
ConcurrentHashMap
:- 底层 :在 JDK8 之后,和
HashMap
一样,采用 数组 + 链表 / 红黑树。 - 特点 :线程安全 ,但实现机制更优。它使用 CAS +
synchronized
(只锁住数组的某一个桶(链表或树))来保证并发安全,性能远高于Hashtable
。
- 底层 :在 JDK8 之后,和
集合类 | 底层数据结构 | 特点 |
---|---|---|
ArrayList |
动态数组 | 查询快,增删慢(中间) |
LinkedList |
双向链表 | 增删快,查询慢 |
HashSet |
基于HashMap |
无序,唯一 |
HashMap |
数组 + 链表 / 红黑树 | 键值对,无序,高效 |
LinkedHashMap |
HashMap + 双向链表 |
保持插入或访问顺序 |
TreeMap |
红黑树 | Key 可排序 |
ConcurrentHashMap |
数组 + 链表 / 红黑树 | 线程安全 的 HashMap |
