两者最大的区别是tabel是线程同步的,而map不是。
-
从线程安全来看,HashMap不是线程安全的,在多线程情况下可能遇到并发问题,hashTable是线程安全的,但是通过内部方法添加syn来解决的,效率低下,而且在官方注释中hashTable是保留类,不建议使用。如需要线程安全可使用ConcurrentHashMap。
-
在结构上,hashTable一直是数组和链表结构,而hashMap在1.8时改为了数组和链表及红黑树。
-
在遍历上,HashTable使用Enumeration,HashMap使用Iterator。
-
在储存支持上,hashMap可以允许一个空健和多个空值,会把 null 转化为 0 进行存储,而hashTable由于需要保证线程安全的特性,不允许任何空。否则会造成歧义,即:这个key到底是存在还是不存在。
-
在容量上,hashTable默认为11,扩容为2n+1,而hashMap默认为16,扩容为2倍。如添加指定长度,table会直接使用,而map总会扩充为2的n次幂。
-
在散列算法上,上HashTable会使用key对hashCode对长度取模,hashMap会做一些扰动来达到更好的分布。