HashMap 和 Hashtable 有什么区别?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
HashMap 不同步,允许一个 null 键及多个 null 值;Hashtable 的常用读写方法有同步保护,不允许 null 键和值。两者都不提供键的排序保证。新代码通常先考虑 HashMap;确实需要并发共享映射时,按操作语义选择 ConcurrentHashMap 或外部同步方案。
讲清原理
Hashtable 的同步主要围绕同一个表对象展开,能保护单次方法调用;它并不会自动把调用方写出的几步业务操作合成一个原子动作。HashMap 少了内置同步约束,适合线程独占或已经由外层锁统一保护的场景。
| 关注点 | HashMap | Hashtable |
|---|---|---|
| null | 键和值都可用 | 键和值都拒绝 |
| 单次读写同步 | 无内置同步 | 常用方法同步 |
| 选型定位 | 通用非并发映射 | 兼容既有代码 |
例子与易错点
if (!table.containsKey(k)) table.put(k, v); 即使 table 是 Hashtable,两个调用之间仍可能插入别的线程。要实现“只在不存在时写入”,应选择具备所需原子语义的方法,或者把整个判断与写入放在同一把锁中。
“线程安全”要说明保护哪一步;加锁成本也不能直接推导成任何负载下的速度排名。
相关题:第 12 题、第 19 题、第 26 题、第 32 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。