黑马程序员—Java中涉及到的哈希存储知识

---------------------- JavaEE+Android、Java培训、期待与您交流! ----------------------


最近在论坛里发现好多人都在问hashCode()和内存地址之间的关系?HashMap和HashSet为什么效率很高?刚开始我因为学过数据结构,脑海里对哈希存储有些了解,老师讲的时候我就很轻松过去了,但是在回答问题的过程中我发现,真正表达出来真的不容易,我翻阅了以前的学过的数据结构,总结了好久。准备把自己理解的写下来


下面来一个数据结构中的哈希表存储的标准定义:

以线性表中的每个元素的某个数据项(最好是关键字)Key为自变量,使用一种事先选定的函数H(Key)计算出函数值,将该值解释为一块连续存储空间(如数组空间)的单元地址(如数组的下标),将数据元素存储到该单元中。

例如在a[10]中存入1,2,4,5,7值,哈希表会事先选定一个函数,假设该函数为H(Key)=key*3,即每个要存入的值先乘以3,然后将H(Key)的值再和数组大小求余,找到对应下标将Key存入。这个函数我们可以自己设置(不一定要乘以某个数,可以加入平方,立方,求余,怎么爽怎么来,目的是为了避免两个值对应同一个下标产生冲突),乘以300都没问题,因为和数组求余以后它的值和数组下标是对应的,这个函数值太大不会怎么怎么!

Java中HashCode()实现的就是上面怎么得到数组下标的过程,他返回的就是对应存储方式的单元地址(如数组下标)。

那么如果真的遇到冲突怎么办?(得到的数组下标一样。而且本来那块连续的存储空间就是有限的)

数据结构中提供了两种方法,开放地址法,链接法。Java中采用的就是链接法,用单链表存储,该数组下标中存入的是指向单链表的指针。如下图:

到此,哈希存储的具体原理知道了,可以看到它好像一本书有目录的书一样,在它里面查找时效率非常高,所以哈希法存储结构在数据结构中地位很高。这么牛逼Java中肯定有不少地方用!



---------------------- JavaEE+Android、Java培训、期待与您交流! ----------------------

详细请查看: http://edu.csdn.net

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章