问:说说 Hashtable 与 HashMap 的区别?
答:首先要说 Hashtable 算是一个过时的集合类,因为 JDK1.5 中提供的 ConcurrentHashMap 是 HashTable 的替代品,其扩展性比 HashTable 更好。由于 HashMap 和 Hashtable 都实现了 Map 接口,所以其主要的区别如下:
HashMap 是非 synchronized 的,而 Hashtable 是 synchronized 的。
HashMap 可以接受 null 的键和值,而 Hashtable 的 key 与 value 均不能为 null 值。
HashMap 的迭代器 Iterator 是 fail-fast 机制的,而 Hashtable 的 Enumerator 迭代器不是 fail-fast 机制的(历史原因)。
单线程情况下使用 HashMap 性能要比 Hashtable 好,因为 HashMap 是没有同步操作的。
Hashtable 继承自 Dictionary 类且实现了 Map 接口,而 HashMap 继承自 AbstractMap 类且实现了 Map 接口。
HashTable 的默认容量为11,而 HashMap 为 16(安卓中为 4)。
Hashtable 不要求底层数组的容量一定是 2 的整数次幂,而 HashMap 则要求一定为 2 的整数次幂。
Hashtable 扩容时将容量变为原来的 2 倍加 1,而 HashMap 扩容时将容量变为原来的 2 倍。
Hashtable 有 contains、containsKey、containsValue 方法,而 HashMap 只有 containsKey 和 containsValue 方法。