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算法都大概一样,所以性能不会有很大的差异。
- 历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 。
- 同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 。
- 值:只有HashMap可以让你将空值作为一个表的条目的key或value。