HashMap非线程安全且支持null键值,Hashtable线程安全但已弃用、不支持null、性能差;推荐使用ConcurrentHashMap,其分段锁/CAS机制兼顾安全与高性能。
HashMap 不是线程安全的,Hashtable 是线程安全的,但已基本被弃用。 这是最核心的区别。实际开发中,若需线程安全的哈希表,应优先考虑 ConcurrentHashMap,而不是 Hashtable。
Hashtable 的所有 public 方法(如 put()、get()、size())都用 synchronized 修饰,整个对象一把锁,吞吐量低,扩展性差。HashMap 完全不加锁,多线程下可能引发死循环(JDK 7)、数据丢失或 get 返回 null 等问题。
put(),也可能因扩容导致链表成环(JDK 7),引发 CPU 100%HashMap 允许一个 null 键和任意多个 null 值;Hashtable 不允许任何 null 键或 null 值,否则抛出 NullPointerException。
两者都实现了 Map 接口,但历史渊源不同:Hashtable 是 JDK 1.0 就存在的类,继承自已废弃的 Dictionary 抽象类;HashMap 是 JDK 1.2 引入的,属于 Java 集合框架(Collections Framework)一员,设计更规范、API 更统一。
elements() 和 keys(),返回的是 Enumeration,而 HashMap 统一使用 Iterator
computeIfAbsent()),Hashtable 完全不支持从 JDK 5 开始,ConcurrentHashMap 提供了更精细的并发控制(分段锁 → JDK 8 改为 CAS + synchronized 操作桶节点),兼顾线程安全与高性能。
null 值(但不允许 null 键),行为更接近 HashMapputIfAbs
ent()、compute(),避免外部同步