HashMap 和 Hashtable

HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。

线程安全

HashMap 是线程安全的,Hashtable 不是。

Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

使用速度

HashMap 速度比 Hashtable 更快。

因为 HashMap 不需要对方法实现同步,所以速度更快。

空值

HashMap允许将null作为一个entry 的key或者value。

Hashtable 不允许把 null 作为 K 或者 V。

延伸

对一般的情况来说,上面的 3 个情况可能是在具体使用的时候出现的最大可能性的不同。

下面是更深入的一些延伸,如果不知道也没太大关系。

继承的类不同

Hashtable 继承自 Dictionary类。

而HashMap是Java1.2引进的Map interface的一个实现。

contains 方法

HashMap 把Hashtable的contains 方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

总结

Hashtable 和 HashMap采用的 hash/rehash算法都大概一样,所以性能不会有很大的差异。

  1. 历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 。
  2. 同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 。
  3. 值:只有HashMap可以让你将空值作为一个表的条目的key或value。