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相同的冲突

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

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

(0)
上一篇 2022年5月14日 上午11:40
下一篇 2022年5月14日 下午12:00


相关推荐

  • vmware15最新激活码2021-激活码分享

    (vmware15最新激活码2021)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html92U4ILM59M-eyJsa…

    2022年3月29日
    63
  • 一般人到底要不要学Python_Python值得学吗

    一般人到底要不要学Python_Python值得学吗前言本人纯屌丝一枚,在学python之前对电脑的认知也就只限于上个网,玩个办公软件。这里不能跑题,我为啥说自学python,一般人我还是劝你算了吧。因为我就是那个一般人。基础真的很简单,是个人稍微认点真都能懂,这就是好多人说的python简单、易懂、好学,然后就是一顿浮夸的言论,误导那些小白,再然后那些小白也就跟着浮夸。这里我就给那些轻浮的人泼一桶冷水,懂跟学会是一码事吗?先来说哈python这个就业哈,我现在生活在祖国的肚皮上–成都,(嗯,有想了解川西迷你小环线的在下面留言哦),下面亲身经历,我喃,

    2025年8月30日
    9
  • 选择排序

    选择排序

    2021年12月16日
    44
  • window修改host文件权限_win10hosts文件在哪

    window修改host文件权限_win10hosts文件在哪文章目录第一步进入host目录下第二步编辑hosts文件中users用户的属性第三步授权users用户完全控制权限第四步编辑hosts文件第一步进入host目录下第二步编辑hosts文件中users用户的属性第三步授权users用户完全控制权限第四步编辑hosts文件格式IP地址(空格)网址202.108.22.5www.baidu.com…

    2022年10月10日
    5
  • Postman用法简介

    Postman用法简介Postman 用法简介 Http 请求模拟工具 在我们平时开发中 特别是需要与接口打交道时 无论是写接口还是用接口 拿到接口后肯定都得提前测试一下 这样的话就非常需要有一个比较给力的 Http 请求模拟工具 现在流行的这种工具也挺多的 像火狐浏览器插件 RESTClient Chrome 浏览器插件 Postman 等等 这里主要介绍一下 Postman nbsp 一 Postman 说明

    2025年10月10日
    8
  • 带通滤波器的matlab程序设计

    带通滤波器的matlab程序设计最近初入信号处理,对带通滤波器的资料进行总结。转载自:如何在matlab用带通滤波器进行滤波?matlab中fdatool使用说明Matlabfir滤波(conv)以上链接详细记录了带通滤波器的设计及matlab自带fdatool的使用步骤。自己编的一个带通滤波器的程序及解释fs=500;%采样率n=length(data);

    2022年5月11日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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