-
允许 null 的情况:
- HashMap 允许键和值都为 null。
- Hashtable 不允许键或值为 null。如果尝试存储 null 键或值,会抛出 NullPointerException。
-
同步性:
- HashMap 不是同步的,也就是非线程安全的。在多线程环境下使用 HashMap 可能导致不确定的结果。
- Hashtable 是同步的,所有的方法都是同步的,适合多线程环境。但是,这也导致了在性能上的开销。在 Java 5 之后,推荐使用 ConcurrentHashMap 代替 Hashtable。
-
快速失败 vs. 安全失败:
- HashMap 是快速失败的。在迭代过程中,如果其他线程对 HashMap 进行结构上的修改,会抛出 ConcurrentModificationException。
- Hashtable 使用的是安全失败机制,通过 Enumeration 遍历元素,它不会抛出 ConcurrentModificationException。但是,这也带来了一些问题,例如,如果在迭代期间对 Hashtable 进行结构上的修改,可能会产生不确定的结果。
-
遗留性质:
- Hashtable 是较早的 Java 集合实现,而 HashMap 是在 Java 1.2 引入的。因此,一般认为 Hashtable 是一个遗留的类,而 HashMap 是它的替代者,提供了更好的性能和灵活性。