大家在面试时经常被问到HashMap与Hashtable的区别。从二者的源码中可以直接看出来,HashMap 继承自 AbstractMap,而 Hashtabl 继承自 Dictionary。
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
简单小结二者的区别如下:
1).HashMap与Hashtable从用法上来说基本一样,都是表示键值对的一种数据类型。
2).Hashtable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3).Hashtable 在很多方法定义时都会加上 synchronized 关键字,说明 Hashtabl 是线程安全的,而 HashMap 并不能保证线程安全。
4).HashMap 中把 contains 方法去掉的原因主要它容易引起混淆,不如 containsKey 和 containsValue 表达的准确。而 Hashtable 中 contains 方法也是调用 containsKey 方法来实现的。
5).Hashtable虽然是同步的,但是目前也不推荐使用。因为它是历史遗留类,内部优化不好。强烈推荐使用ConcurrentHashMap替代Hashtable,完全没必要使用Hashtable.