Java面试题更新 2026-08-03

请从线程安全性、锁粒度、数据结构和迭代行为等方面,对比分析 ConcurrentHashMap 与 Hashtable 的差异。

考察说明

考察对 Java 并发容器特性及其演进的理解。

回答思路

  1. 【回答框架 1】Hashtable 是线程安全的哈希表,其所有公开方法均使用 synchronized 对整个表加锁,任何读写操作都会锁住整个对象,并发度低,效率差;ConcurrentHashMap 通过分段锁或 CAS 实现高并发读写,锁粒度更细。
  2. 【回答框架 2】Java 8 之前的 ConcurrentHashMap 使用 Segment 分段锁,默认 16 个 Segment,每个 Segment 独立加锁,不同 Segment 可并发操作;Java 8 起改为 CAS + synchronized 对数组首节点加锁,锁粒度进一步细化到单个桶,读操作通常无锁,并发度更高。
  3. 【回答框架 3】数据结构上,Hashtable 仅使用数组加链表;ConcurrentHashMap 在链表长度超过阈值时转换为红黑树,优化了哈希冲突严重时的查询性能;Hashtable 不支持 null 键值,ConcurrentHashMap 同样不支持,二者均线程安全,但迭代器方面 Hashtable 的迭代器是弱一致性的,而 ConcurrentHashMap 的迭代器也是弱一致性,不抛 ConcurrentModificationException。
  4. 【回答框架 4】实际使用中,除非必须兼容遗留代码,否则应优先选用 ConcurrentHashMap 替代 Hashtable;普通非并发场景可用 HashMap。
  5. 【关键点 1】Hashtable 全表加锁,并发度低;ConcurrentHashMap 锁粒度细,并发度高。
  6. 【关键点 2】ConcurrentHashMap 在 Java 8 后采用 CAS 加 synchronized 锁首节点,读多写少性能更好。
  7. 【关键点 3】ConcurrentHashMap 支持链表转红黑树,优化查询;Hashtable 无此机制。
  8. 【关键点 4】两者均不允许 null 键值,迭代器均为弱一致性。
  9. 【关键点 5】并发场景推荐 ConcurrentHashMap,非并发用 HashMap。
  10. 【易错点 1】不要误以为 ConcurrentHashMap 所有操作都无锁,写操作仍可能加锁。
  11. 【易错点 2】ConcurrentHashMap 的 size() 等方法并非完全实时准确,只是弱一致性结果。
  12. 【易错点 3】禁止将线程安全问题完全托付给 ConcurrentHashMap,复合操作仍需额外同步。