Java 集合
约 550 字大约 2 分钟
2026-05-18
Q: 说说集合架构
集合由 Collection 和 Map 派生而来。
Collection 分为 Set 、 List 、 Queue。
Map 分为 HashMap 、HashTable、SortedMap
Q: HashMap 和 Hashtable 的区别
- 线程安全不同:HashMap 不安全,Hashtable 安全
- 性能不同:HashMap 高,Hashtable 低
- null 支持不同,HashMap key 和 value 都能存 null,Hashtable 不允许。
- Hashtable 已经被淘汰!
- 初始容量和扩容机制不同
- HashMap 未指定大小时,默认 16,扩容 2 倍。
- HashMap 指定大小时,扩容为 2 的幂次方大小。
- 底层机制不同
- HashMap 解决 hash 冲突时,链表长度大于默认阈值 8 时会转换为红黑树
- Hashtable 无此机制。
Q: HashMap 底层数据结构(数组+链表/红黑树)
1.7 以前:数组 + 链表
1.8 以后:数组 + 链表/红黑树,但是 hash 冲突处理机制 有变化,大于阈值 8 会转为红黑树(先扩容)。
Q: HashMap 扩容机制(触发时机、翻倍、元素重分布)
元素个数 > 容量 × 负载因子(0.75) 时发生扩容,默认 2 倍,若指定大小,则为 2 的幂次方。
扩容后会重新分布元素位置。
Q: 为什么容量是 2 的幂次?
用 (n - 1) & hash 替代取模运算,速度更快,扩容时元素重新分布更简单(有可能移动到一个固定偏移量)
Q: 链表转红黑树的阈值及原因
链表长度 > 8 且数组长度 ≥ 64 时转红黑树;阈值 8 是基于泊松分布概率,链表长度到 8 的概率极低,避免频繁转换。
Q: ConcurrentHashMap 如何保证线程安全?
- 初始化时用 CAS 保证只初始化 1 次。
- 对同一个桶的第一个节点加锁 (sychronized),粒度小。
- 读操作不加锁,用 valatile 保证可见性。
Q: ConcurrentHashMap 和 Hashtable 有什么不同?
- 锁粒度不同,ConcurrentHashMap 锁一个桶,Hashtable 锁整个表
- ConcurrentHashMap 性能高、支持更多并发写
Q: ConcurrentHashMap 的 size() 方法是怎么实现的?
非精确值,通过 CounterCell 累加,避免全局锁,性能高。
Q: ConcurrentHashMap 允许 null key 或 null value 吗?
不允许,有歧义,并发场景无法区分 key 是 null 还是 key 不存在。
版权所有
版权归属:FelixJY
