• 散列表(Hash Table)


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

  • 相关阅读:
    小进步一点
    首个vue.js项目收尾中……
    elememtui(有关权限的那些事)
    vue.js2.0+elementui ——> 后台管理系统
    console.log篇
    select下拉框不能赋值
    vue中的小踩坑(01)
    vue2.0+element-ui(01简单点的单页面)
    lodash(二)对象+循环遍历+排序
    lodash(一)数组
  • 原文地址:https://www.cnblogs.com/tsxf/p/6483825.html
Copyright © 2020-2023  润新知