博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

散列表(Hash Table)

Posted on 2017-03-01 13:24  one_stone  阅读(87)  评论(0编辑  收藏  举报

   对于散列表说的比较详细,可以去这里看看:http://www.nowamagic.net/academy/detail/3008010

当初上数据结构课的时候,也知道有散列表(哈希表),没认识到有什么作用,工作后,接触到java看到集合里面也有哈希,不知道这两者有没有关联,今天好奇又重新看了一篇哈希,总结一下以备复查。

   对于数据量比较大,如何快速的查找,删除数据,如何采用数组,链表的数据结构,会从头开始逐个比较,匹配,效率低下,如果能够根据存储的对象,获取对象的存储位置,这样算法复杂度就是O(1),哈希就是为这而生的。

散列表的定义

    散列表是而直接访问在内存存储位置的数据结构,根据键(Key)而直接访问在内存存储位置,也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

    照这个定义来看,问题来了,如何定义散列函数?,存储的值也即这个f(x)的函数值会不会重复?这个散列表在什么样的场景下使用,有什么优缺点?

   维基百科中对于上面的解释,比较容易理解,原文:https://zh.wikipedia.org/wiki/%E5%93%88%E5%B8%8C%E8%A1%A8

散列表在java中是如何使用的

    既然是获取对象的存储位置,进而获取到对象的值,一般也是为了比较两个对象是否一样,Object中有一个equals方法,需要子类去重写自己的实现方式,比较两个对象的内容是否相等,这个对象的位置在java中是用hashcode存储的,所以,如果子类重写了equals方法,也要重写hashcode方法,两个方法的返回值要一致。

     也就是说对于两个对象,如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等;

  如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同;

  如果两个对象的hashcode值不等,则equals方法得到的结果必定为false;

  如果两个对象的hashcode值相等,则equals方法得到的结果未知。

      因此有人会说,可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。

   具体看参考海子的博客:http://www.cnblogs.com/dolphin0520/p/3681042.html

 

 

 

 

 

 

 

 

 

 

参考文献:https://zh.wikipedia.org/wiki/%E5%93%88%E5%B8%8C%E8%A1%A8

              http://www.cnblogs.com/dolphin0520/p/3681042.html

tsxf