HashMap、Hashtable、ConcurrentHashMap详细解答

前言:

最近碰到了好多关于HashMapHashtable区别和练习题,小弟不才,从网上摘抄理解并作出如下总结。对于HashMapHashtableConcurrentHashMap的原理进行理解。网上文章多了去了,博而不精。在此阐述本人观点,文章可以小,但应该做到句句点睛。

HashMap、Hashtable、ConcurrentHashMap联系

无论是HashMap、还是Hashtable、亦或是ConcurrentHashMap在内存中都是一个Entry的单项链表(哈希表的Key-Value键值对存储在Entry链表中)。在Java中无论是HashMap还是Hashtable都是以Key-Value的键值对形式存储元素的,使用hashCode()equals()函数来向集合添加、检索元素。当调用put()方法时,会计算KeyHash值然后把键值对存贮在集合中适合的索引上。如果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.关于NullHashMap允许null值,Hashtable不允许null值存在

5.遍历方法不同,俩者都可以使用迭代器来实现遍历,但是Hashtable多了枚举类型的遍历。

6.hash值不同,Hashtable直接使用对象的哈希值,HashMap则重新计算对象的哈希值。

7.扩容方式不同,HashMap2的倍数扩容,Hashtable则以2*n+1扩容。

8.ConcurrentHashMapHashtable的主要区别在于锁的粒度以及如何锁,ConcurrenthashMap实现的是桶锁,这种方法能够显著提高并发性。由于历史原因,一般认为Hashtable是遗留类(从这个不男不女的名字就可以看出来),可以使用ConcurrentHashMap来替代。

接下来在总结一下如何避免哈希冲突问题,有四种解决方式:

1.       开放地址法(线性探测再散列法、二次线性探测再散列法、伪随机探测再散列法),也称比哈希法

2.       再哈希法

3.       链地址法,也称开哈西法

4.       建立公共溢出区

 



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值