对于散列表说的比较详细,可以去这里看看: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