java集合类的底层类是哪个
Git
程序员面试资料大全|各种技术书籍等资料-1000G
详细解析
一、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 |
程序员面试资料大全|各种技术书籍等资料-1000G
Git