Hash散列[通俗易懂]

Hash散列[通俗易懂]为了速度而散列HashMap速度总所周知是非常快的,但是为什么会这么快,是因为它的散列技术,下面简单理解一下散列知识散列的价值在于速度,使得查询得以快速。一般容器查询的速度的瓶颈位于键的查询,采取的做法一般是对键进行排序,但散热则不是散列的特点散列的做法,通常把键保存到某个地方,存储一组元素最快的数据结构就是数组,所以用它来保存键的信息(不是键本身),但是由于…

大家好,又见面了,我是你们的朋友全栈君。

为了速度而散列

HashMap速度总所周知是非常快的,但是为什么会这么快,是因为它的散列技术,下面简单理解一下散列知识

散列的价值在于速度,使得查询得以快速。一般容器查询的速度的瓶颈位于键的查询,采取的做法一般是对键进行排序,但散列则不是

散列的特点

散列的做法,通常把键保存到某个地方,存储一组元素最快的数据结构就是数组,所以用它来保存键的信息(不是键本身),但是由于数组是固定,不能调整大小,但是我们存储元素的数量有时候是不确定的。故而,有个难题,如果用数组保存不确定元素大小的值。

散列的做法,数组不保存键本身,而是通过键对象生成一个随机数字,用作数组的下标,这个数字就是我们通常见到的hashCode。解决了数组固定的问题,随之问题又来了,因为不同的键有可能会生成一样的下标,故而冲突。造成我们查询的时候,虽然在数组中找到相同的位置,但是却不是我们想要的值。我们查询是通过查询对象计算出一个散列码,如果能保证没有冲突,重复,那就可能有了一个完美的散列函数。

通常,冲突由外部链接处理,数组不直接保存值,而是保存值的list,然后遍历list,进行equals线性查询,这部分的查询自然会比较慢,但是如果散列函数好的话,每个位置都只有较少的值。因为,不是查询整个list,而是快速跳到数组的位置,只对很少的值进行比较,这既是hashMap快的原因了。

slot 和 bucket

散列中的槽位(solt)通常称为桶位,以内实际散列表的数组名称为bucket,
桶的数量都使用质数。为了能够自动解决冲突,使用了LinkedList,每一组新元素都自动添加到你list末尾的某个特定桶位中。关于泛型数组,你也可以创建数组的引用。向上转型这样也是很方便的,这样可以防止后面的代码中进行额外的转型。

pull

对于pull方法,针对键本身调用,生成hashCode,并且将其结果强制转换为正数。为了产生的数值适合bucket数组的大小,取摸操作符
将按照该数组的尺寸取模,如果该数组的某个位置是null,则创建一个新的LinkedList,一般过程是,查看该位置的list是否有相同的元素,有的话就把赋值给oldValue,然后用新的值取代旧的值,标记found用来跟踪是否找到旧的的值,如果没有,则将新的添加到list的末尾。

get 和 put

get()和put() 按照相同的方式计算在buckets数组的索引,得以保证计算的hashCode是相同的。如果此位置有LinkedList存在,进行查询

put(key,value)分析

先计算key的hash,然后区域作为bucket数组的下标,而bucket数组是一个LinkedList数组,如果发现没有,则new 一个List,如果存在,则遍历这个List,如果发现key值已经存在于这个List,则替换旧的值,oldValue = newValue,并设置found=true,如果key值不相同,则下一步为直接添加到List的尾部,这样也解决了hashcode相同的冲突

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/146553.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • GSLB负载均衡策略

    GSLB负载均衡策略负载均衡策略1.静态策略1)基于特定的用户源IP地址:特定的IP地址段定向到特定的POP节点或者虚拟服务器2)基于加权的IP地址:这里的IP地址是服务池中的虚拟服务器的IP地址.他们的权重不同,这样GSLB在为用户请求轮询解析域名时,根据权重来选择IP3)基于加权的POP节点:基于物理上的节点4)基于地理位置:选择一个在地理位置上与用户距离最近的POP节点或者虚拟服…

  • hdu 5685

    hdu 5685

  • ggplot2数据分析与图形艺术_plot画多条曲线

    ggplot2数据分析与图形艺术_plot画多条曲线接着我们之前复现过的一篇NC文章(复现《naturecommunications》散点小提琴图+蜜蜂图),有一张关于差异蛋白的火山图,但是不同的是他的阈值设定不是我们普通的横向纵向,而是曲线阈值!image.png本来我以为这是一个个例,本篇文章作者博眼球的做法,但是检索了一下发现我付肤浅了,有很多文章,但是有一个特点,双曲线阈值应用在蛋白组差异基因的筛选上,这样的方式类似与“软阈值”吧,能够找到更显著的蛋白,值得在自己的研究中使用。image.png(Reference:ProteomicsofMe

  • JavaScript 引擎性能比较之一SpiderMonkey[通俗易懂]

    JavaScript 引擎性能比较之一SpiderMonkey[通俗易懂]1.下载https://people.mozilla.org/~sstangl/mozjs-31.2.0.rc0.tar.bz2bunzip2mozjs-31.2.0.rc0.tar.bz2tarxvfmozjs-31.2.0.rc0.tar2.构建https://developer.mozilla.org/en-US/docs/Mozilla/Projects/

  • csdn如何转载博客_怎么在csdn上写博客

    csdn如何转载博客_怎么在csdn上写博客后续的文章将自动同步到csdn

  • wireshark安装步骤(为什么软件安装不上)

    参考网络分析工具——WireShark的使用(超详细)Wireshark安装+使用(一)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号