Hashtable与Hashmap底层都是基于散列表实现的(数组+链表结构)
Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。
虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛的一种数据类型,主要原因是因为Hashtable是线程安全的,效率比较低
Hashtable与Hashmap的区别
1、继承抽象类不同
Hashtable和Hashmap都实现了Map, Cloneable, Serializable接口,都是他们继承的父类不同
Hashtable继承了Dictionary抽象
Hashmap继承了AbstractMap抽象
由于继承的抽象类不同,所以拥有的方法也不同, 比如HashMap把Hashtable的contains方法去掉了,改成containsValue和
containsKey,因为contains方法容易让人引起误解。
2、储存的元素不同
Hashtable既不支持Null key也不支持Null value。
HashMap中,null可以作为键,只能有一个;可以有多个值为null。当get()方法返回null值时,可能是 HashMap中没有该键, 也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用 containsKey()方法来判断。
3、安全性不同
Hashtable是线程安全的,通过synchronized实现线程同步。
HashMap是非线程安全的,所以速度比Hashtable快。可以使用 Collections.synchronizedMap(new HashMap)来转换
4、计算hash值的方法不同
Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模
HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸
5、初始容量大小和每次扩充容量大小的不同
Hashtable初始容量为11,HashMap的初始容量为16,两者的填充因子默认都是0.75
Hashtable扩容时是容量翻倍+1即:capacity*2+1,HashMap扩容时是当前容量翻倍即:capacity*2(HashMap 的 bucket 数组 大小一定是2的幂)