HashMap和HashTable都实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆,实现Map接口。
HashMap的父类AbstractMap类。
Hashtable的父类Dictionary。
Hashtable既不支持Null key也不支持Null value。都会抛空指针。
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。
HashMap不是线程安全的。
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。
HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
计算hash值的方法不同,Hashtable直接使用对象的hashCode。
计算hash值的方法不同,HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。
HashMap 与 concurrentHashMap
hashMap线程不安全,concurrentHashMap线程是安全的,hashTable线程安全的
HashMap的线程不安全主要体现在下面两个方面:
1.在JDK1.7中 数组 + 链表,当并发执行扩容操作时会造成环形链和数据丢失的情况。
2.在JDK1.8中 数组 + 链表\红黑树,在并发执行put操作时会发生数据覆盖的情况。