Java集合面试知识点总结(超详细版)
Java 集合是 Java 面试中的 高频核心知识点,几乎所有 Java 面试都会问到,例如:
-
ArrayList 和 LinkedList 区别
-
HashMap 原理
-
HashMap 为什么线程不安全
-
HashMap 扩容机制
-
ConcurrentHashMap 原理
-
Set 和 List 区别
本文系统整理 Java集合框架 + 面试常问知识点。
一、Java集合框架整体结构
Java 集合主要分为 两大体系:
Collection(单列集合)
Map(双列集合)
整体结构:
Collection
|
--------------------------------
| | |
List Set Queue
|
ArrayList
LinkedList
Vector
Map
|
-------------------------
| | |
HashMap TreeMap Hashtable
|
LinkedHashMap
|
ConcurrentHashMap
二、Collection 接口
Collection 是 所有单列集合的父接口。
主要子接口:
List
Set
Queue
常用方法:
add()
remove()
size()
clear()
contains()
isEmpty()
iterator()
三、List 集合(有序、可重复)
List 的特点:
-
有序
-
可重复
-
支持下标访问
常见实现类:
ArrayList
LinkedList
Vector
四、ArrayList 原理(面试重点)
ArrayList 是 最常用的集合。
底层结构:
动态数组
源码核心:
transient Object[] elementData;
1 ArrayList 默认容量
new ArrayList()
初始容量:
0
第一次添加元素后:
10
2 ArrayList 扩容机制(重点)
扩容规则:
原容量 × 1.5
例如:
10 → 15 → 22 → 33
源码逻辑:
add()
↓
ensureCapacity()
↓
grow()
↓
Arrays.copyOf()
核心代码:
newCapacity = oldCapacity + (oldCapacity >> 1);
3 ArrayList 优缺点
优点:
-
查询快(随机访问)
-
内存连续
缺点:
-
插入删除慢
-
扩容有性能损耗
五、LinkedList 原理
LinkedList 底层是:
双向链表
结构:
Node{
prev
item
next
}
LinkedList 特点
优点:
-
插入快
-
删除快
缺点:
-
查询慢
因为需要遍历链表。
六、ArrayList 和 LinkedList 区别(高频面试题)
| 对比 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组 | 双向链表 |
| 查询 | 快 | 慢 |
| 插入删除 | 慢 | 快 |
| 内存占用 | 少 | 多 |
| 线程安全 | 不安全 | 不安全 |
总结:
查询多用 ArrayList
增删多用 LinkedList
七、Vector(了解)
Vector 是 线程安全的 List。
线程安全方式:
synchronized
例如:
public synchronized boolean add(E e)
缺点:
-
性能低
因此现在基本被:
ArrayList
替代。
八、Set 集合(不允许重复)
Set 特点:
-
无序
-
不允许重复
常见实现类:
HashSet
LinkedHashSet
TreeSet
九、HashSet 原理
HashSet 底层其实是:
HashMap
源码:
private transient HashMap<E,Object> map;
存储结构:
value 固定为 Object
示例:
map.put(e,PRESENT);
HashSet 去重原理
核心依赖:
hashCode()
equals()
执行流程:
hashCode()
↓
判断桶位置
↓
equals()
↓
判断是否相同
因此如果想让对象去重:
必须重写:
equals()
hashCode()
十、TreeSet
TreeSet 底层:
红黑树
特点:
自动排序
例如:
TreeSet<Integer> set = new TreeSet<>();
排序方式:
1️⃣ 自然排序
2️⃣ Comparator 排序
十一、Map 集合
Map 是 键值对集合:
key → value
特点:
-
key 不可重复
-
value 可以重复
常见实现类:
HashMap
LinkedHashMap
TreeMap
Hashtable
ConcurrentHashMap
十二、HashMap 原理(面试重点)
HashMap 是面试 最重要集合。
底层结构:
数组 + 链表 + 红黑树
结构:
Node<K,V>[]
JDK1.8 之后:
数组 + 链表 + 红黑树
十三、HashMap 存储流程
执行:
put(key,value)
流程:
key.hashCode()
↓
数组下标
↓
判断是否冲突
↓
链表 / 红黑树
十四、HashMap 为什么是 2 的幂
HashMap 默认容量:
16
原因:
为了提高 哈希计算效率。
计算数组位置:
index = (n-1) & hash
比 % 运算更快。
十五、HashMap 扩容机制
默认容量:
16
负载因子:
0.75
扩容条件:
size > capacity × loadFactor
例如:
16 × 0.75 = 12
当元素超过 12 就会扩容。
扩容规则:
容量 × 2
十六、HashMap 什么时候变成红黑树
JDK1.8 之后优化。
当链表长度:
≥ 8
会转换成:
红黑树
当长度:
≤ 6
又会退化成:
链表
这样可以提高查询效率。
十七、HashMap 为什么线程不安全
在多线程情况下:
resize()
可能导致:
死循环
数据丢失
因此 HashMap 不是线程安全。
十八、ConcurrentHashMap(高频)
为了解决 HashMap 线程安全问题。
JDK1.7:
Segment + HashEntry
分段锁。
JDK1.8:
CAS + synchronized
锁粒度更小。
因此性能更高。
十九、HashMap vs Hashtable
| 对比 | HashMap | Hashtable |
|---|---|---|
| 线程安全 | 不安全 | 安全 |
| 性能 | 高 | 低 |
| null | 允许 | 不允许 |
二十、Collections 工具类
Collections 是集合工具类。
常见方法:
排序:
Collections.sort(list);
最大值:
Collections.max(list);
最小值:
Collections.min(list);
反转:
Collections.reverse(list);
二十一、Iterator 迭代器
Iterator 用于遍历集合。
示例:
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
二十二、Java集合线程安全方案
常见方式:
1️⃣ Vector
2️⃣ Collections.synchronizedList()
List list = Collections.synchronizedList(new ArrayList());
3️⃣ ConcurrentHashMap
推荐使用:
ConcurrentHashMap
二十三、Java集合常见面试题总结
高频问题:
1️⃣ ArrayList 和 LinkedList 区别
2️⃣ ArrayList 扩容机制
3️⃣ HashMap 原理
4️⃣ HashMap 为什么线程不安全
5️⃣ HashMap 扩容机制
6️⃣ HashMap 为什么容量是 2 的幂
7️⃣ HashSet 去重原理
8️⃣ ConcurrentHashMap 原理
9️⃣ TreeSet 底层结构
🔟 HashMap JDK1.7 和 1.8 区别
总结
Java 集合框架核心知识:
List
Set
Map
重点掌握:
ArrayList
LinkedList
HashMap
HashSet
ConcurrentHashMap
因为这些几乎是 Java 面试必问知识点。
更多推荐



所有评论(0)