hash函数(哈希表)

2023-10-27

一:什么叫做散列表 (哈希表)

散列表是存储key、value映射的一种集合。散列表也叫做哈希表
散列表底层也是数组,只是通过一种hash函数来计算他的key值

二:hash函数

在Java中每一个对象都有属于自己的hashcode,这个hashcode是区分不同对象的重要标识。无论对象自身类型是什么,它们的hashcode都是一个整新变量。
计算hash函数(取模运算)
index=Hashcode(Key)%Array.length
在java中hash函数并没有直接采用取模运算,而是利用了位运算的方式来优化性能。

三:hash冲突

hash冲突是指在我们的散列表中,有两个不同对象他们的hash值是一样的。导致他们的key指不一样,计算出来的下标一样。
解决方法一:开放寻址法
当查找出来的下标被占用时,我们就 另谋高就 ,寻找下一个空挡位置
(ThreadLocal使用的就是开放寻址法)
解决方案二:链表法
在散列表中,每一个元素不仅是一个entry对象,还是每一个链表的头节点,每一个entry对象通过next指针指向它的下一个entry节点。当一个新的entry对象发生hash冲突时,就把该对象放入链表next中即可。

四:hashmap的读取操作

哈希表是由数组+链表组成的,数组的默认长度为16(可以自动变长。在构造HashMap的时候也可以指定一个长度),数组里每个元素存储的是一个链表的头结点。而组成链表的结点其实就是hashmap内部定义的一个类:Entity。
Entity包含三个元素:key,value和指向下一个Entity的next
我们通过元素的key计算它的hash值,拿到它的下标,查看对应的下标存储的key值对不对应。不对应就顺着链表的next一直往下找,直到找到尾节点或者找到相同匹配的key。

五:hashmap的扩容操作

hashmap有链表为什么要进行扩容呢?
当我们的散列表达到一定的饱和度时,key映射位置发生冲突的概率逐渐提高,这样一来,大量元素都会拥挤在相同数组下标位置,形成很长的链表。而我们链表查询是比数组慢的,时间复杂度是O(n)。
hashmap扩容方法?
hashmap的扩容因子是0.75,就是达到容量的百分之75就会进行扩容。
为什么扩容因子是0.75,因为数组容量越大,发生hash碰撞的概率也就越小,当数组满了之后,hash碰撞的概率会变得更高。)
1:扩容,创建一个新的entry空数组,长度是原来的两倍。
2:重新hash,遍历原来的Entry数组,把所有的Entry重新hash到新数组中。为什么要重新hash呢?
因为我们数组长度扩容后,我们hash函数也会进行改变,数组原来的key计算的hash值获取的下标也会进行改变。这样hashmap的hash冲突概率会减少,链表长度也会减少。查询插入速度也会更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hash函数(哈希表) 的相关文章

  • 彻底弄懂二叉树的先序、中序、后序三种遍历与做题

    最近有同学考计算机二级不懂树遍历的计算 就找上我解惑 作为老好人的博主的我 但是义不容辞的上来阐述了一番 先来官方的概念 树的遍历 是指对树中所有结点信息的访问 即依次对树中每个结点的访问一次且仅访问一次 分为 先序遍历 后序遍历 层次遍历

随机推荐

  • java ip地址转数字,java版ip地址与整数的互相转换

    在工作中可能会遇到将ip地址转为long型的整数 或者将十进制整数转换为ip地址的情况 下面介绍一种转换的方法 一 将ip地址转成long数值 将IP地址转化成整数的方法如下 1 通过String的split方法按 分隔得到4个长度的数组
  • 被骗几十万总结出来的Ddos攻击防护经验!

    转载地址 http www ijiandao com safe cto 15952 html 本人从事网络安全行业20年 有15年防ddos攻击防护经验 被骗了很多回 都说能防300G 500G 买完就防不住了 本文当然重点给大家说明 dd
  • Flask4:methods=[‘POST‘, ‘GET‘]

    从服务器上获取数据 用GET请求 前端把数据发给服务器 用POST请求 在 app route上 添加methods参数 这个参数是一个列表类型 可以传递多个 右键页面 检查 中
  • Vue3/ Vue3 和 Vue2 生命周期函数不同点 总结、Vue2 和 Vue3 里面父组件的生命周期顺序

    一 Vue3 x 和 Vue2 x 生命周期函数不同点 总结 Vue2 vue3 beforeCreate gt setup 开始创建组件之前执行 created gt setup 开始创建组件之前执行 beforeMount gt onB
  • 【满分】【华为OD机试真题2023 JS】简单的解压缩算法

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 简单的解压缩算法 知识点栈 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现需要实现一种算法 能将一组压缩字符串还原成原始字符串 还原规则如下 1 字符后面加数
  • 高并发短信平台实现

    01 短信介绍 在项目介绍的时候 已经定义了austin项目的核心功能 发送消息 我认为 短信是在一整个消息推送平台里最重要的一个消息类型了 毕竟关联了很多重要的业务场景 想想我们日常使用APP时的场景 验证码 登录注册 支付等等重要场景
  • matplotlib 绘制Sigmoid函数,Tanh函数,ReLU函数

    import numpy as np import matplotlib pyplot as plt def sigmoid x return 1 1 np exp x def tanh x return np exp x np exp x
  • python global函数用法及常用的 global函数代码

    Python中的 global函数是用于在程序中定义变量的函数 在我们实际的开发中 我们可能会用到 global函数来定义变量 但是我们在这里就不具体介绍它的用法了 global函数定义变量的方法 global函数使用参数a来指定变量在程序
  • 外卖点餐系统小程序 PHP+UniAPP

    一 介绍 本项目是给某大学餐厅开发的外面点餐系统 该项目针对校内的学生 配送由学校的学生负责配送 因此 该项目不同于互联网的外卖点餐系统 该系统支持属于 Saas 系统 由平台端 商家端 用户端 以及配送端组成 其中 平台端 商家端是由基于
  • 520七夕表白,还不懂浪漫?4套代码教会你如何深情表白【建议收藏】❤️

    马上又到了脱单的黄金时刻 七夕啦 如果你有喜欢的女孩子 一定要趁着这个时候把喜欢说出口 但是该不会还有人表白在学校的操场上摆着爱心蜡烛抱一束花喊一堆人来围观吧 No 请你立刻马上放弃这个计划 毫无心意不说 对于女孩子来说是真的很社死啊 PS
  • linux 查看java安装目录

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 获取java安装路径前要判断是否已经安装成功java 执行命令 java 1 U
  • 清晰图解,一图看懂图卷积GCN、时空图卷积ST-GCN

    目录 1 前言 2 普通卷积与图卷积 2 1 普通卷积 2 2 图卷积 3 ST GCN图卷积的代码解读 4 图卷积的缺陷 5 参考文献 6 联系方式 1 前言 本文为我阅读论文 Spatial Temporal Graph Convolu
  • 微信小程序API~GET

    框架提供丰富的微信原生API 可以方便的调起微信提供的能力 如获取用户信息 本地存储 支付功能等 1 wx on 开头的 API 是监听某个事件发生的API接口 接受一个 CALLBACK 函数作为参数 当该事件触发时 会调用 CALLBA
  • libmysqlclient.so.15: cannot open shared object file: No such file or directory

    libmysqlclient so 15 cannot open shared object file No such file or directory 分类 mysql服务器管理优化 2009 06 02 16 11 26769人阅读
  • DC系列漏洞靶场-渗透测试学习复现(DC-6)

    DC 6是一个易受攻击的实验环境 最终目的是让攻击者获得root权限 并读取flag DC 6使用的操作系统为Debian 64位 靶场下载链接 1 http www five86 com downloads DC 6 zip 2 http
  • P2141 [NOIP2014 普及组] 珠心算测验

    题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术 珠心算训练 既能够开发智力 又能够为日常生活带来很多便利 因而在很多学校得到普及 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法 他随机生成一个正整数集合
  • HTML之表格篇——表格的嵌套

    表格的嵌套一方面是为使页面 贴子 的外观更为漂亮 利用表格嵌套来编辑出复杂而精美的效果 另一方面是出于布局需要 用一些嵌套方式的表格来做精确的编排 或者二者兼而有之 熟练地掌握表格的嵌套技巧并不是很困难的 只要你思路清晰 对表格的整体嵌套构
  • Shiro源码分析之ShiroFilterFactoryBean

    创建核心Filter 同其他框架一样 都有个切入点 这个核心Filter就是拦截所有请求的 通过web xml中配置的Filer进入 执行init方法获取这个instance 调用下面的createInstance方法创建核心Filter
  • 学习《TensorFlow实战Google深度学习框架》(九)LeNet-5模型

    文章目录 6 4 经典卷积网络模型 6 4 4 LeNet 5模型 LeNet 5模型的架构 源代码 6 4 经典卷积网络模型 6 4 4 LeNet 5模型 LeNet 5模型是Yann LeCun教授于1998年在论文Gradient
  • hash函数(哈希表)

    一 什么叫做散列表 哈希表 散列表是存储key value映射的一种集合 散列表也叫做哈希表 散列表底层也是数组 只是通过一种hash函数来计算他的key值 二 hash函数 在Java中每一个对象都有属于自己的hashcode 这个has