1. 简介
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {}
HashTable 继承了 Dictionary 类,实现了 Map 接口。其中 Dictionary 类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类,每个键和每个值都是一个对象,在任何一个 Dictionary 对象中,每个键最多和一个值相关联,Map 接口定义了键映射到值的规则,它是一个键值对接口,另外 HashTable 实现了 Serializable 接口和 Cloneable 接口。
2. 继承体系
3. HashTable 与 HashMap 的区别
-
首先,HashMap 是线程不安全,HashTable 是线程安全的。HashMap 的内部实现中没有任何与线程同步相关的代码,所以相对而言性能要好一点。但是如果在多线程中使用 HashMap 的话,需要自己管理线程同步。至于 HashTable,它大部分的对外接口都使用 synchronized 关键字包裹,所以是线程安全的,但是性能会相对差一些。
-
其次,二者的基类不一样。HashMap 继承了 AbstractMap 类,HashTable 继承了 Dictionary 类。另外,它们都实现 Map, Cloneable, Serializable 这些接口。AbstractMap 类中提供的基础方法更多,并且实现了多个通用的方法,而 Dictionary 类中只有少量的接口,并且都是 abstract 类型。
-
第三,他们的 key 和 value 的取值范围不同。HashMap 的 key 和 value 都可以为 null,但是 HashTable 的 key 和 value 都不能为 null。对于 HashMap,如果 get() 方法返回 null,并不能表明 HashMap 不存在这个 key,如果需要判断 HashMap 中是否包含某个 key,就需要使用 containsKey() 方法来判断。
-
再者,他们采用的算法不一样。HashMap 的初始化容量为 16,而 HashTable 的初始化容量为 11。HashMap 中初始容量必须是 2 的整数次幂,如果初始化传入的 initialCapacity 不是 2 的整数次幂,将会自动调整为大于初始化的 initialCapacity 的最小 2 的整数次幂。HashMap 每次扩容都是翻倍,而 HashTable 每次扩容都是变为原来的 2*n+1。HashMap 使用自己的方法计算 hash(会依赖 key 的 hashCode 方法),而 HashTable 是直接使用 key 的 hashCode() 方法得到。
-
最后,HashTable 是遗留类,多线程环境下建议可以使用 ConcurrentHashMap。