一、父类和接口
继承的父类不同,看源码就可以清晰看出
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable {
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
二、对 null的支持
HashMap:key可以为null,但只能有一个,因为要保证唯一性,但允许有多个value为null
Hashtable:key和value都不能为null
三、安全性
首先HashMap是线程不安全的,所以在多线程下,可能会产生死锁等问题。虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的使用场景都是单线程。
Hashtable则是线程安全的,因为它的每个方法都有关键字synchronized,这个关键字会实现同步的功能。但其效率或者说访问速度会慢很多。
四、对外提供的接口不同
Hashtable
比
HashMap
多提供了
elments()
和
contains()
两个方法。
elments()
方法继承自
Hashtable
的父类
Dictionnary
。
elements()
方法用于返回此
Hashtable
中的
value
的枚举。
contains()
方法判断该
Hashtable
是否包含传入的
value
。它的作用与
containsValue()
一致。事实
上,
contansValue()
就只是调用了一下
contains()
方法。