Hashmap和Hashtable计算在Entry[]数组中index的方法到底有什么区别

Hashmap跟Hashtable的实现原理比较类似,借用一张其他地方偷来的图。


                                                  外拉链式的Hash表

可以看到,都是采用外拉链的方式来实现元素存储,底层是数组+链表实现,原理都不说了,学过数据结构中hash冲突解决的同学应该都能理解。

实现的关键在于如何通过key来计算对应value应该存放到数组中的位置:

HashTable的做法:[index = (hash & 0x7FFFFFFF) % tab.length;](1)这相当于直接将hash值对数组长度取模(跟0x7FFFFFFF做&操作是为了保证hashcode的值为正数)。HashTable中数组的初始size为11,每次扩容都按照newsize = oldsize*2+1来计算。通过取模来计算index的值,从概率上来讲,保证了节点在数组上分配比较均匀(形成尽量短的拉链,有利于提高查询效率),但是取模操作的消耗是比较大的。



HashMap 的做法则非常巧妙:[index = hash & (tab.length - 1)](1)。这有什么精妙之处呢,首先,Hashmap要求数组的size为2的幂乘,比如16,32,64,仔细看,当数组大小为16的时候,tab.length-1=15,在内存中的表示是00001111,将hash值与00001111做&(位与)操作后,会将hash值除了后四位全部抹为0,只保留了后四位,这样的方式完成了跟index = (hash & 0x7FFFFFFF) % tab.length一样的效果,就是取模。但是位运算的效率比取模操作高得多,也就是说HashMap的index计算方式要比Hashtable快得多。(Hashmap的初始size是16,每次扩容按照newsize = oldsize*2)

写Android的小伙伴可以在Android Studio中打开HashTable的源码看看,Google很明显的改动了Hashtable的index计算方式,改成跟Hashmap一样啦!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值