HashMap里面的散列函数是什么

Mamba-ST实战:用状态空间模型实现艺术风格迁移的5个关键步骤 本文详细介绍了如何使用Mamba-ST状态空间模型实现高效的艺术风格迁移,涵盖环境配置、数据预处理、模型架构、训练策略和推理优化等5个关键步骤。Mamba-ST基于SSM(状态空间模型)构建,在保持生成质量的同时显著降低计算复杂度,为风格迁移领域提供了新的解决方案。 阅读详情

HashMap里面的散列函数(求在数组中的下标)是什么

(length - 1) & hash 首先要知道一点,HashMap的容量大小一定是2的幂次形式(1,2,4,8…). 原因的话可以看一下上一篇文章HashMap源码解析(一) 当执行new HashMap时都执行了什么?. 大致就是第一次初始化容量的时候hashmap会初始化为比传入容量大小大的最小的二的次幂,后面扩容的时候每次乘二(实际用的是左移操作).
知道了这一点之后我们就知道length是二的次幂. 那么对于一个二的次幂减一之后的二进制表示是什么样的呢

2-1 -> 1
4-1 -> 11
8-1 -> 111
16-1 -> 1111

看出规律了吧.就是把length的二进制表示去掉了最高位然后把所有的低位都补了1
然后看一下&也就是 与 操作.每一位&0之后都会是0.如果了解计算机网络的话,应该就很容易看出这个(length-1)&hash的作用了.(length-1)实际上的作用是掩码,把所有的高位全部过滤掉.得到的余下的数一定小于length. 可以直接作为在table数组的下表了. 到这里看来,这个过滤操作本身就可以作为一个散列函数了.
但是我们最常用的散列函数不是取余数吗?其实这个操作本身得到的结果和hash%length取余的结果是一样的.我们看一下余数的定义:余数指整数除法中被除数未被除尽部分
再来看一下我们的操作我们把高位都过滤掉了,那些高位代表的数一定是length的倍数,那么余下来的小于length的数不就是余数了.所以HashMap中使用了一个位运算来巧妙且快速的求出了余数.

HashMap中的Hash函数(求hash值)

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

最近阅读HashMap源码的时候看到HashMap里的hashcode对Key本身的hashcode进行了额外的操作key.hashCode()) ^ (h >>> 16);
查了一些资料看了一下这里为什么要进行这样的操作:

这个操作实际上是进行了一次扰动,可以理解为对原来的hash码又进行了一次随机化的操作来减少碰撞.

先看一下这个操作做了什么,从源码可以看出来将原来hash码的低十六位和自己的高十六位进行了一次异或操作.也就是为低十六位进行了又一次的随机操作.根据上面的介绍我们很容易想到当我们的数据量不是足够大时,基本上用到的只有hash码的后面几位,前面的都被掩码掩盖掉了(取余取掉了).
这样做的好处是可以减少碰撞,但是具体怎么减少的就不得而知了,可以参考一下扰动函数. 文章里举了个例子:
随机选取了352个字符串,在他们散列值完全没有冲突的前提下,对它们做低位掩码,取数组下标。在这里插入图片描述
做了扰动操作的碰撞数有所改善,碰撞减少了10%左右.也算是很大的提高了.
顺带提一句,Jdk7中做了四次扰动操作,JDK8只做了一次.

从数据库到数据仓库:数据仓库导论 本文为数据仓库导论,旨在介绍数据仓库的基本理念和应用场景,帮助读者理解数据仓库的重要性及其在企业中的实际应用。 阅读详情

相关推荐

从零到一:AnythingLLM与Ollama的本地知识库搭建实战

本文详细介绍了如何使用AnythingLLM与Ollama从零开始搭建本地知识库,涵盖技术选型、环境部署、系统配置及优化策略。通过RAG技术架构,实现安全高效的文档管理与智能问答,特别适合企业及个人构建私有化知识管理系统。

weixin_29079643的博客 562

Java集合(一)HashMap实现原理及散列思想

在 HashMap 中,用于存储所有的{Key,Value}对的真实数组 table ,有一个初始化的容量,但随着插入的元素越来越多,数组的resize机制会被触发,而扩容时,容量永远是2的幂次,这也是为了保证取模运算的高效。比如,26进制的散列函数就有一个巨大的缺陷,就是它所需要的数组空间太大了,在刚刚的示例代码中,仅表示长度为3位的、只有a-z构成的字符串,就需要开一个接近20000(26。,目标是找到一个合适的槽位,找到当前链表中的key和待插入的key相同的节点,或者直到遍历到链表的尾部;

m0_58466443的博客 1412

Canoe Panel基础功能介绍

CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值

m0_56208280的博客 1948

HashMap的散列函数

HashMap基础 首先在应用的层次: 大家最常使用的是 Map<xxx,xxx> map = new HashMap<>(); map.put(xxx,xxx); map.get(xxx); 作为Map类型:其特点:键值对,根据其键去取其值。 那么内部HashMap是怎么一个实现机理勒? HashMap实现机理 散列函数(哈希函数的一种)、连续的存储空间(数组)! 大致...

weixin_42040155的博客 1347

【ISP图像处理】Demosaic去马赛克技术演进与边缘优化策略

本文深入解析了ISP图像处理中的Demosaic(去马赛克)技术。从Bayer阵列原理出发,梳理了从双线性插值、Hamilton-Adams边缘导向算法到利用通道相关性与自相似性的技术演进历程,并重点探讨了针对边缘与纹理伪影的优化策略,为工程实践中的算法选型与硬件协同设计提供了专业指导。

weixin_29091445的博客 386

Ubuntu无桥接模式或连不上网(详细解决方法

目录 问题1:Ubuntu没有未桥接的主机网络适配器 解决方法 1.打开VMware安装目录下的文件 ​编辑2.右键安装以上三个文件 3.打开网络状态属性,找到VMware bridgeProtocol,点击安装 问题2.Ubuntu桥接模式连不上网 1.win+r打开cmd终端,输入ipconfig /all 2.记录以下数据 3.打开VMware网络设置 问题1:Ubuntu没有未桥接的主机网络适配器 VMWare安装之后,虚拟网络一直使用默认配置 VMnet0为...

m0_65592409的博客 6062

散列(哈希)表

1.如何构造散列函数,总结三点散列函数设计的基本要求: 1)散列函数计算得到的散列值是一个非负整数 //下标从0开始 2)如果key1 = key2,那么hash(key1)==hash(key2) //相同的key经过hash 得到的散列值应该是相等的。 3) 如果key1 != key2, 那么hash(key1) != hash(key2)//这个是理想情况下,越接近...

哇哦~ 1187

(2024,DDPM,DDIM,流匹配,SDE,ODE)扩散:基础教程

本文的目标是尽可能简单地教授扩散。第一节介绍扩散的基本原理。第二节和第三节展示如何构建随机和确定性扩散采样器。第四部分介绍了密切相关的流匹配,可看作是扩散的推广。​第五节,强调实践中最重要的一些设计选择,包括采样器、噪声时间表和参数化方法。

qq_44681809的博客 1万+

重温数据结构:哈希 哈希函数 哈希表

点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 在学习 HashMap 前,我们先来温习下 Hash(哈希) 的概念。 什么是 HashHash(哈希),又称“散列”。散列(hash)英文原意是“混杂”、“拼凑”、“重新表述”的意思。在某种程度上,散列是与排序相反的一种操作,排序是将集合中的元素按照某种方式比如字典顺序排列在一起,而散列通过计算哈希值,打破元素之间原

张拭心的博客 shixinzhang 2万+

树莓派4B之OpenCV人脸识别实战:从Haar Cascade到实时检测(保姆级教程)

本教程详细介绍了如何在树莓派4B上部署OpenCV,并利用Haar Cascade算法实现实时人脸识别。内容涵盖从系统环境搭建、算法原理解析到代码逐行讲解与实战调优,为嵌入式AI和计算机视觉初学者提供了一份完整的保姆级实践指南。

p8q9r0的博客 402

2026华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C++实现。

MISAYAONE的博客 20万+

HashMap

HashMap 1.概述 ​ HashMap底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。HashMap 是非线程安全类,在多线程环境下可能会存在问题。 2.原理 ​ HashMap采用了拉链式的散列算法,数据结构采用数组+链表(JDK8之后为数组+链表+红黑树)。进行增删查操作时,先定位到元素的所在桶的位置,之后再从链表中定位该元素。

weixin_45864754的博客 407

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

本文系统介绍了运算放大电路的基础知识及其应用。主要内容包括:1)运算放大器的基本结构、理想特性及分析方法(虚短、虚断、叠加定理);2)比例运算电路(同向、反向、差分)的工作原理与仿真分析;3)求和运算、加减运算电路的实现方法;4)积分、微分、指数和对数运算电路的基本原理;5)过零电压比较器的功能特点。通过理论分析和仿真实验,详细阐述了各类运算放大电路的输入输出特性、相位关系和增益计算,为硬件工程师提供了实用的电路设计参考。

XU157303764的博客 2477

散列表是什么(散列函数、散列冲突、HashMap、LinkedHashMap)

一、什么是散列表 ? 散列表用的是数组支持下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。 举个例子,我们将参赛选手设置一个编号,比如051167,表示 5 年级 11 班 67 号选手,然后在数组索引下标对应 67 的位置存储该选手,这就是典型的散列思想,我们将参赛选手的编号叫做键(key)或者关键字,用它来标识一个选手,把参赛编号转化为数组下标的映射方法就叫作散列函数...

Seina 8233

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

HashMap,Hashcode,散列值,散列函数之间的关系

hashCode:一个对象无论重写hashCode与否,都会生成一个哈市Code值 hashCode的作用: hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的; 两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。 hashMap:存放方式是数

bug01111的博客 580

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

hashmap是散列表吗_数据结构中的散列与散列函数

介绍数据结构中的散列的基本概念,以及散列函数,Java中HashMap中的散列函数以及Java8中HashMap中引入的红黑树。散列的基本概念散列表(hash table)的实现常常叫做散列(hashing),散列是一种用于以常数平均时间执行插入、删除和查找的技术。理想的散列表数据结构只不过是一个包含一些项(item)的具有固定大小的数组。每个关键字(key)被映射到从0到TableSize-1这...

weixin_39621488的博客 191

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HashMap中的散列函数、冲突解决机制和rehash

一、概述 散列算法有两个主要的实现方式:开散列和闭散列,HashMap采用开散列实现。 HashMap中,键值对(key-value)在内部是以Entry(HashMap中的静态内部类)实例的方式存储,散列表table是一个Entry数组,保存Entry实例。 对于冲突的情况,在开散列中,如果若干个entry计算得到相同散列地址(具体是由indexFor(hash(key.hashCode...

weixin_30627381的博客 699

hashmap扩容线程安全问题_Hashmap全解:散列函数、哈希冲突、扩容方案、线程安全...

前言很高兴遇见你~HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点。本文并不打算讲解基础的使用api,而是深入HashMap的底层,讲解关于HashMap的重点知识。需要读者对散列表和HashMap有一定的认识。HashMap本质上是一个散列表,那么就离不开散列表的三大问题: 散列函数、哈希冲突、扩容方案 ;同时作为一个数据结构,必须考虑多线程并发访问的问题,也就是 线程...

weixin_39631755的博客 435

HashMap——散列函数与哈希冲突

table数组中,一个entry数据结构对应一条链表,也就是一个哈希桶,有相同hash值的存放在一条链表上,不同hashcode返回值区分链表上的键值对。 为了防止单链表的产生,要正确的选择散列函数 散列函数:映射地址的函数,有几种方式 1.直接定址法:选择某个关键字key的线性函数得到的地址作为散列地址 2.除留取余法:关键字除以某个比散列表长度小的素数得到的余数作为散列地址 3.平均取中法:关...

YurYur的博客 421

理解HashMap有关的重要概念——哈希(散列)函数

理解有关HashMap的重要概念——哈希(散列)函数。

成长记录——编程、跑步、阅读、未来…… 418

Java HashMap源码分析(含散列表、红黑树、扰动函数等重点问题分析)

写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解。所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项目,专注 Java 后端面试题 + 解析 + 重点知识详解 + 精选文章的开源项目,希望它能伴随你我一直进步! 说明:此项目内容参考了诸多博主(已注明出处),资料,N本书籍,以及结合自己理解,重新绘图,重新组织语言等等所制。个人之力绵薄,或有不足之处,在所难免,但更新/完善会一直进行。大家的每一个 Star 都

理想二旬不止 - 专注JAVA技术 518

关于hashmap的散列程度分析

背景 先从查找算法说起,我们知道常用的查找算法有顺序查找(时间复杂度为O(n)),二分查找(时间复杂度为O(log2n)),二叉查找树查找(O(longN)),有基于Hash表的算法时间复杂度只有O(1) 但是基于hash表的算法要额外维护一个hash表,这也是用空间换时间的例子吧. 什么是HashMap hashMap可以拆分为hash和map,hash是一个函数,或者说算法,用来计...

tangyaya8的博客 917

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

聂可以的博客 2242

散列表及散列冲突解决方案

1、散列表 看过HashMap源码的同学应该知道,HashMap是基于哈希表(散列表)的 Map 接口的非同步实现。 在我们put了一条key-value数据后,如下图,程序会先将key通过hash(key)这个函数转化成整形,这个整形做为数组的下标,插入数据或查找数据。 我们发现,散列表用的是数组支持按照下标随机访问数据的特性(时间复杂度O(1)),所以散列表其实就是数组的一种扩展...

u010530712的博客 1万+

Java学数据结构(4)——散列表Hash table &amp; 散列函数 &amp; 哈希冲突_java 散列表

另外,保证所有的单元都能被探测到也是很重要的(但在下面的例子中这是不可能的,因为表的大小不是素数)。例如,关键字可能是完整的街道地址,散列函数可以包括街道地址的几个字符,也许还有城市名和邮政编码的几个字符。有些程序设计人员通过只使用奇数位置上的字符来实现他们的散列函数,这里有这么一层想法:用计算散列函数节省下的时间来补偿由此产生的对均匀地分布的函数的轻微干扰。下面的技术将会排除这个缺撼,不过这要付出计算一个附加的散列函数的代价。不过,这是不可能的,因为单元的数目是有限的,而关键字实际上是用不完的。

2401_87373774的博客 1358

如何实现一个优秀的散列表!

假设现在有一篇很长的文档,如果希望统计文档中每个单词在文档中出现了多少次,应该怎么做呢?很简单!我们可以建一个HashMap,以String类型为Key,Int类型为Value;遍历文档中的每个单词word,找到键值对中key为word的项,并对相关的value进行自增操作。如果该key=word的项在 HashMap中不存在,我们就插入一个(word,1)的项表示新增。这样每组键值对表示的就是某个单词对应的数量,等整个文档遍历完成,我们就可以得到每个单词的数量了。if (!

月伴飞鱼 1046
上一篇: HashMap源码解析(二) HashMap的rehash操作:resize()函数
下一篇: HashMap源码解析(三) HashMap的put与get操作
codexjli
博客等级 码龄11年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值