hashMap 与 hashTable 的区别
hashMap 不是synchronized [ˈsɪŋkrənaɪzd] 的,也就是线程不安全。而hashTable是synchronized的,是线程安全的。 如果存在多个线程同时读写同一个hashMap,那么需要手动加锁才能保证线程安全,而hashTable的方法本身就有锁,不需要手动加锁。
也正是因为hashTable的方法本身有锁,所以hashTable的读取速度比hashMap要慢。如果是单线程,推荐使用hashMap 。如果是多线程,为了保证线程安全,推荐使用hashTable(在java5以后,hashTable逐渐被舍弃,可以使用ConcurrentHashMap完成与hashTable相同的功能)。
hashMap中 , Key 和 Value 都可以是null , 在hashTable中,Key和value都不能是null。
hashMap 的默认容量是16 , hashTable的默认容量是11 。 两者的填充因子默认都是0.75。hashMap要求底层的数组容量必须是2的整数次幂, hashTable不要求。在数据量达到超过阀值时,二者都会自动扩展,hashMap会自动扩展到原容量的2倍, hashTable会自动扩展到原容量的2倍+1。
是否包含contains方法。 hashMap把contains方法去掉了, 改成了 containsKey() 和 containsValue()方法。 hashTable有 contains() 、containsKey()、containsValue()方法 , 其中 contains()和containsValue()功能相同。
哈希值的使用是不同的,HashTable的hash值是直接使用对象中的hashCode方法,而HashMap则是重新计算对象的HashCode;并且用与代替求模。
HashMap继承自AbstractMap类
Hashtable继承自Dictionary [ˈdɪkʃənri] 类
但二者都实现了Map接口。
- 三者效率的比较:
由于安全机制的原因,HashMap的效率比HashTable,CurrentHashMap的效率高;但是由于CurrentHashMap加锁的高效性,HashTable是整个加锁,他的效率比HashTable高; 总的来说 HashMap>CurrentHashMap>HashTable;
- 三者效率的比较:
参考文章:https://blog.csdn.net/u010476994/article/details/80049715
https://blog.csdn.net/qq_29882585/article/details/52198014
https://blog.nowcoder.net/n/40d21b0208a64bd5881070d4ade47be1