java 中HashMap 和 Hashtable 有什么区别?

HashMap非线程安全但性能高,允许null键和值;2. Hashtable线程安全但性能低,不允许null键和值;3. HashMap继承AbstractMap,Hashtable继承Dictionary;4.推荐使用HashMap或ConcurrentHashMap。

HashMap 和 Hashtable 都是 Java 中用于存储键值对的哈希表实现,但它们在多个方面存在关键差异。了解这些区别有助于在实际开发中做出合适的选择。

线程安全性不同

Hashtable 是线程安全的,它的方法大多是同步的(synchronized),这意味着在多线程环境下可以直接使用,但性能较低。HashMap 不是线程安全的,如果在多线程环境中使用,需要外部同步控制,比如通过 Collections.synchronizedMap() 包装,或者使用 ConcurrentHashMap 替代。

是否允许

null 键和 null 值

HashMap 允许一个 null 键和多个 null 值。例如:
map.put(null, "value1"); map.put("key2", null); 是合法的。
而 Hashtable 不允许任何 null 键或 null 值,否则会抛出 NullPointerException

性能表现

由于 Hashtable 的方法基本都被 synchronized 修饰,每个操作都要获取锁,因此在单线程环境下性能明显低于 HashMap。HashMap 在非并发场景下更高效,适合大多数普通用途。

继承的父类不同

HashMap 继承自 AbstractMap 类,而 Hashtable 继承自遗留的 Dictionary 类。这使得 HashMap 更符合现代集合框架的设计规范,也支持更多集合操作的统一接口。

基本上就这些。日常开发推荐使用 HashMap,若需线程安全,优先考虑 ConcurrentHashMap 而不是 Hashtable,后者已经基本被废弃。