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

外拉链式的Hash表
可以看到,都是采用外拉链的方式来实现元素存储,底层是数组+链表实现,原理都不说了,学过数据结构中hash冲突解决的同学应该都能理解。
实现的关键在于如何通过key来计算对应value应该存放到数组中的位置:
HashTable的做法:[index = (hash & 0x7FFFFFFF) % tab.length;](1)这相当于直接将hash值对数组长度取模(跟0x7FFFFFFF做&操作是为了保证hashcode的值为正数)。HashTable中数组的初始size为11,每次扩容都按照newsize = oldsize*2+1来计算。通过取模来计算index的值,从概率上来讲,保证了节点在数组上分配比较均匀(形成尽量短的拉链,有利于提高查询效率),但是取模操作的消耗是比较大的。


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

本文对比了Hashmap和Hashtable两种数据结构的实现原理,重点分析了两者在计算元素存放位置上的不同方法及其效率差异。
714

被折叠的 条评论
为什么被折叠?



