✅ 一、集合框架基本结构
接口 | 特点 |
---|---|
Collection |
根接口,定义了集合的基本操作,如增删查等 |
List |
有序、可重复元素,支持索引访问 |
Set |
无序、不可重复元素 |
Queue |
一种先进先出的集合,常用于任务调度 |
Deque |
双端队列,既可作为队列也可作为栈 |
Map |
键值对结构,不属于 Collection ,但常并列讨论 |
ArrayList
和 LinkedList
的区别?方面 | ArrayList | LinkedList |
---|---|---|
底层结构 | 动态数组 | 双向链表 |
查询效率 | 高(O(1)) | 低(O(n)) |
增删效率 | 末尾快,中间慢 | 任意位置都快(O(1)插入/删除) |
是否线程安全 | 否 | 否 |
适用场景 | 频繁访问 | 频繁插入、删除 |
面试技巧: 可以结合实际使用场景举例,比如分页展示用 ArrayList,队列任务用 LinkedList。
HashSet
和 TreeSet
的区别?方面 | HashSet | TreeSet |
---|---|---|
底层结构 | HashMap | TreeMap(红黑树) |
是否有序 | 否 | 是,按自然顺序或指定比较器 |
插入查找效率 | O(1) | O(log n) |
允许 null 吗 | 允许一个 null | 不允许 null |
红黑树考点:TreeSet 是基于红黑树实现的,保证元素有序。
HashMap
和 Hashtable
的区别?方面 | HashMap | Hashtable |
---|---|---|
线程安全 | 否 | 是(方法加了 synchronized ) |
是否允许 null | 允许一个 null 键和多个 null 值 | 不允许 |
性能 | 高 | 低 |
出现时间 | JDK1.2 | JDK1.0(过时) |
HashMap
做了哪些优化?当链表长度超过 8 且桶数量 > 64 时,链表转为红黑树,优化查找性能从 O(n) 到 O(log n)
更好的 hash 分布,减少 hash 冲突
resize
更高效,扩容后节点分布更均匀
集合类 | 实现方式 |
---|---|
Vector / Hashtable |
方法加锁(效率低) |
Collections.synchronizedList() |
外部包装同步 |
CopyOnWriteArrayList |
写时复制,读操作无锁,高并发读场景使用 |
ConcurrentHashMap |
分段锁(JDK 1.7),CAS+链表/红黑树(JDK 1.8) |
加分项:ConcurrentHashMap
是面试重头戏!你可以讲它在 JDK1.8 使用了 CAS + synchronized 来提高性能。
HashMap
的底层实现原理?简要流程:
通过 hash(key)
计算哈希值
定位数组索引:(n - 1) & hash
若该位置为空,直接插入;否则链表(或红黑树)处理冲突
超过负载因子 0.75 时扩容(resize)
HashMap
的初始容量是 16?扩容为什么是 2 倍?16 是 2 的幂,便于位运算优化
2 倍扩容可使 hash 重新分布,减少冲突,提高性能
方面 | Iterator | ListIterator |
---|---|---|
支持方向 | 单向 | 双向 |
是否支持增删 | 支持删除 | 支持增删 |
使用范围 | 所有集合 | 仅用于 List |
增强 for 本质使用的是 Iterator
,不能同时修改集合
调用 remove()
需显式使用迭代器,否则会抛出 ConcurrentModificationException
HashMap
的 key 应该是不可变对象?防止 hashCode()
或 equals()
改变,导致定位错误、数据丢失
常用 String
、Integer
等不可变类作为 key
equals()
与 hashCode()
的关系?如果两个对象 equals()
相等,它们 hashCode()
一定相等
反之不成立
集合如 HashSet
、HashMap
必须重写这两个方法,否则查找异常
“为什么不建议在 foreach 中使用 remove?”
“HashMap 的线程不安全体现在什么地方?”
“ConcurrentHashMap 的 size 为什么不精确?”
类型 | 面试重点 |
---|---|
数据结构原理 | ArrayList、LinkedList、HashMap、TreeMap |
线程安全 | HashTable、ConcurrentHashMap、CopyOnWriteArrayList |
时间复杂度 | 增删查各集合的时间复杂度 |
底层机制 | HashMap 的 hash、扩容、树化 |
场景应用 | 根据业务选择合适集合 |