Java 集合是 Java 面试中出现频率最高的内容之一。无论是初级还是高级 Java 开发岗位,集合相关问题几乎是必问的。
常见问题包括:
-
Java 集合体系结构
-
List、Set、Map 的区别
-
ArrayList 和 LinkedList 的区别
-
HashMap 的底层实现
-
HashMap 为什么是线程不安全
-
HashMap 和 Hashtable 的区别
-
HashSet 为什么不允许重复
-
ConcurrentHashMap 原理
本文将系统总结 Java 集合高频面试题。
一、Java 集合体系结构
Java 集合主要分为两大类:
Collection
Map
AI写代码java运行
1 Collection 体系
Collection 用于存储 单个元素。
主要分为:
Collection
├── List(有序,可重复)
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector
│
└── Set(无序,不可重复)
├── HashSet
├── LinkedHashSet
└── TreeSet
AI写代码java运行
特点:
| List | 有序,可重复 |
| Set | 无序,不可重复 |
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案【点击此处即可/免费获取】
https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho
2 Map 体系
Map 用于存储 键值对(key-value)。
Map
├── HashMap
├── LinkedHashMap
├── TreeMap
├── Hashtable
└── ConcurrentHashMap
AI写代码
特点:
| HashMap | 无序 |
| LinkedHashMap | 有序 |
| TreeMap | 排序 |
| Hashtable | 线程安全 |
| ConcurrentHashMap | 高并发 |
二、List 集合
List 集合特点:
-
有序
-
可重复
-
可以通过索引访问
常见实现类:
-
ArrayList
-
LinkedList
-
Vector
三、ArrayList 面试题
1 ArrayList 的底层数据结构
ArrayList 底层是 动态数组。
transient Object[] elementData;
AI写代码java运行
特点:
-
查询快
-
插入慢
-
删除慢
原因:
数组需要 移动元素。
2 ArrayList 扩容机制
默认容量:
10
AI写代码
当数组不够时:
扩容为:
原容量 + 原容量 / 2
AI写代码
例如:
10 → 15 → 22 → 33
AI写代码
源码逻辑:
newCapacity = oldCapacity + (oldCapacity >> 1);
AI写代码java运行
优点:
减少扩容次数,提高效率。
3 ArrayList 为什么线程不安全
因为没有加锁。
例如:
两个线程同时添加元素:
size++
AI写代码
可能会导致:
-
数据覆盖
-
数组越界
解决方式:
1️⃣ 使用 Collections.synchronizedList
List list = Collections.synchronizedList(new ArrayList());
AI写代码java运行
2️⃣ 使用 CopyOnWriteArrayList
四、LinkedList 面试题
1 LinkedList 底层结构
LinkedList 底层是 双向链表。
结构:
prev ← node → next
AI写代码java运行
特点:
-
插入快
-
删除快
-
查询慢
2 LinkedList 为什么插入快
因为:
不需要移动元素。
只需要修改指针:
node.next = newNode
newNode.prev = node
AI写代码java运行
时间复杂度:
O(1)
AI写代码
五、ArrayList 和 LinkedList 区别
| 数据结构 | 数组 | 双向链表 |
| 查询 | 快 | 慢 |
| 插入 | 慢 | 快 |
| 删除 | 慢 | 快 |
| 内存 | 少 | 多 |
总结:
查询多 → ArrayList
插入删除多 → LinkedList
六、Set 集合
Set 的特点:
-
不允许重复
-
无索引
常见实现:
-
HashSet
-
LinkedHashSet
-
TreeSet
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案【点击此处即可/免费获取】
https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho
七、HashSet 面试题
1 HashSet 为什么不能存重复元素
因为底层使用 HashMap。
源码:
private transient HashMap<E,Object> map;
AI写代码java运行
存储结构:
key = 元素
value = 固定对象
AI写代码java运行
当 key 相同:
就不会再添加。
2 HashSet 判断重复的过程
步骤:
1️⃣ 计算 hashcode
hash = key.hashCode()
AI写代码java运行
2️⃣ 找到数组位置
index = hash % length
AI写代码java运行
3️⃣ 比较 equals()
如果:
hashCode 相同
equals 为 true
AI写代码
则认为是重复元素。
八、HashMap 面试题(重点)
HashMap 是 Java 面试必问。
1 HashMap 底层结构(JDK8)
JDK8 使用:
数组 + 链表 + 红黑树
AI写代码
结构:
数组
↓
链表
↓
红黑树
AI写代码
当链表长度:
>= 8
AI写代码
就会转换成:
红黑树
AI写代码
这样可以提高查询效率。
2 HashMap 默认容量
默认容量:
16
AI写代码
负载因子:
0.75
AI写代码
扩容条件:
容量 × 负载因子
AI写代码
例如:
16 × 0.75 = 12
AI写代码
当元素超过 12 时扩容。
3 HashMap 扩容机制
扩容:
容量 × 2
AI写代码
例如:
16 → 32 → 64
AI写代码
扩容时会进行:
rehash(重新计算位置)
AI写代码
4 HashMap 为什么线程不安全
因为:
多个线程同时操作可能导致:
-
数据覆盖
-
死循环
-
数据丢失
JDK7 中甚至可能出现:
CPU 100%
AI写代码
5 HashMap 和 Hashtable 区别
| 线程安全 | 不安全 | 安全 |
| null | 可以 | 不可以 |
| 性能 | 高 | 低 |
| 出现时间 | JDK1.2 | JDK1.0 |
Hashtable 使用:
synchronized
AI写代码
所以效率较低。
九、ConcurrentHashMap 面试题
ConcurrentHashMap 是:
线程安全的 HashMap
特点:
-
高并发
-
高性能
JDK7 实现
采用:
Segment 分段锁
AI写代码
结构:
Segment[]
↓
HashEntry[]
AI写代码
不同 Segment 可以同时操作。
JDK8 实现
JDK8 使用:
CAS + synchronized
AI写代码
锁粒度更小。
性能更高。
十、TreeMap 面试题
TreeMap 底层是:
红黑树
AI写代码
特点:
-
自动排序
-
key 不能为 null
排序方式:
1️⃣ 自然排序
2️⃣ Comparator
示例:
TreeMap<Integer,String> map = new TreeMap<>();
AI写代码java运行
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc
需要全套面试笔记及答案【点击此处即可/免费获取】
https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho
十一、Java 集合遍历方式
常见遍历方式:
1 for 循环
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
AI写代码java运行
2 增强 for
for(String s : list){
System.out.println(s);
}
AI写代码java运行
3 Iterator
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
AI写代码java运行
十二、fail-fast 机制
很多集合有 fail-fast 机制。
当集合被修改时:
会抛出异常:
ConcurrentModificationException
AI写代码
例如:
for(String s : list){
list.remove(s);
}
AI写代码java运行
解决方法:
使用:
Iterator.remove()
AI写代码java运行
十三、Java 集合高频面试题总结
面试官最喜欢问:
1️⃣ Java 集合体系结构 2️⃣ ArrayList 和 LinkedList 区别 3️⃣ ArrayList 扩容机制 4️⃣ HashMap 底层结构 5️⃣ HashMap 为什么线程不安全 6️⃣ HashMap 扩容机制 7️⃣ HashMap 为什么长度是 2 的幂 8️⃣ HashSet 为什么不重复 9️⃣ ConcurrentHashMap 原理 🔟 fail-fast 机制

