前言:
最近碰到了好多关于HashMap、Hashtable区别和练习题,小弟不才,从网上摘抄理解并作出如下总结。对于HashMap、Hashtable、ConcurrentHashMap的原理进行理解。网上文章多了去了,博而不精。在此阐述本人观点,文章可以小,但应该做到句句点睛。
HashMap、Hashtable、ConcurrentHashMap联系
无论是HashMap、还是Hashtable、亦或是ConcurrentHashMap在内存中都是一个Entry的单项链表(哈希表的Key-Value键值对存储在Entry链表中)。在Java中无论是HashMap还是Hashtable都是以Key-Value的键值对形式存储元素的,使用hashCode()和equals()函数来向集合添加、检索元素。当调用put()方法时,会计算Key的Hash值然后把键值对存贮在集合中适合的索引上。如果Key值已经存在(即常见的哈希冲突问题),Key会做出相应改变。其中Map存储形式还有一些特性:容量(即哈希表的大小)、负载因子、扩容极限等。
阈(yu)值=容量*负载因子
HashMap、Hashtable、ConcurrentHashMap区别
1.首先辨别的就是这些特性,HashMap的初始容量大小为16,当容量达到阈值后扩容2*n。Hashtable的初始容量大小为11,当容量到达阈值后扩容2*n+1,两者的负载因子都为0.75。
2.HashMap继承自AbstractMap类,而Hashtable继承自Dictionary,两者皆实现了Map接口
3.关于线程安全性问题,HashMap是线程不安全的,而Hashtable是线程安全的。为了实现线程安全同样Hashtable失去了一些东西,Hashtable的效率低于HashMap。既然HashMap是线程不安全的,所以HashMap适用于单线程,Hashtable适用于多线程。
4.关于Null,HashMap允许null值,Hashtable不允许null值存在
5.遍历方法不同,俩者都可以使用迭代器来实现遍历,但是Hashtable多了枚举类型的遍历。
6.hash值不同,Hashtable直接使用对象的哈希值,而HashMap则重新计算对象的哈希值。
7.扩容方式不同,HashMap以2的倍数扩容,Hashtable则以2*n+1扩容。
8.ConcurrentHashMap与Hashtable的主要区别在于锁的粒度以及如何锁,ConcurrenthashMap实现的是桶锁,这种方法能够显著提高并发性。由于历史原因,一般认为Hashtable是遗留类(从这个不男不女的名字就可以看出来),可以使用ConcurrentHashMap来替代。
接下来在总结一下如何避免哈希冲突问题,有四种解决方式:
1. 开放地址法(线性探测再散列法、二次线性探测再散列法、伪随机探测再散列法),也称比哈希法
2. 再哈希法
3. 链地址法,也称开哈西法
4. 建立公共溢出区