HashMap的indexFor方法

2023-05-16

关于HashMap中的IndexOf方法原来一直没有想通为什么用&,并且和length-1做运算,今天琢磨了一下

static int indexFor(int h, int length) {  
     return h & (length-1);  
 } 
前提
首先大家知道普通的Hash打散的算法都是mod表的长度,比如h%length,但是HashMap却用的是位运算
分析
HashMap的初始大小和扩容都是以2的次方来进行的,换句话说length-1换成二进制永远是全部为1,比如容量为16,则length-1为1111,大家知道位运算的'&'规则是两个1才得1,遇0得0,也就是说length-1中的某一位为1,则对应位置的计算结果才取决于h中的对应位置(h中对应位取0,对应位结果为0,h对应位取1,对应位结果为1。这样就有两个结果),但是如果length-1中某一位为0,则不论h中对应位的数字为几,对应位结果都是0,这样就让两个h取到同一个结果,这就是hash冲突了,恰恰length-1又是全部为1的数,所以结果自然就将hash冲突最小化了
对比
仔细观察可以发现其实老方法h%length与h&(length-1)得到的结果其实是一个值,但是为什么hashmap中要用后者呢
1.length(2的整数次幂)的特殊性导致了length-1的特殊性(二进制全为1)
2.位运算快于十进制运算,hashmap扩容也是按位扩容,所以相比较就选择了后者
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HashMap的indexFor方法 的相关文章

  • 按值对 HashMap 进行排序[重复]

    这个问题在这里已经有答案了 我需要整理我的HashMap根据其中存储的值 这HashMap包含手机中存储的联系人姓名 另外 我需要在对值进行排序后立即对键进行自动排序 或者您可以说键和值绑定在一起 因此值的任何更改都应该反映在键中 Hash
  • 如何从两个制表符分隔的文件中获取枢轴线?

    给定两个文件file1 txt abc def t 123 456 jkl mno t 987 654 foo bar t 789 123 bar bar t 432 and file2 txt foo bar t hello world
  • HashMap 反向排序? [复制]

    这个问题在这里已经有答案了 所以我遇到了这个方法 它能够按值对 HashMap 进行排序 public static
  • 为什么这个 HashMap.get 返回 null?

    我正在尝试创建一个Hashmap为我执行查找 但是 当我运行此测试代码时 输 出为空 我认为这与密钥存储方式的性质有关 但我并不肯定 也许这是一个类似的怪癖 就像var1 var2不等于 除非它们指向内存中的同一个对象 而您必须使用var1
  • 具有空键功能的线程安全映射

    我需要一个多线程 Map 对象在我的 Web 服务器的缓存中使用 并且我需要null keys HashMap允许我有空键 但是ConcurrentHashMap没有 我尝试创建一个同步版本HashMap using Collections
  • 动态创建对象的副本?

    我的应用程序将我的 Web 服务响应存储到 WeakHashMap 中 在我的应用程序中 我在 UI 中操作从 Web 服务返回的数据 并且由于对象被引用 因此它也会修改引用 在我的弱哈希图中 有没有一种方法可以将对象的副本而不是引用存储到
  • 为什么HashMap比HashSet快?

    我一直在阅读 研究原因HashMap比HashSet 我不太明白以下说法 HashMap比HashSet因为这些值与唯一的键相关联 In HashSet 成员对象用于计算两个对象的哈希码值可以相同 因此equals 方法用于检查相等性 如果
  • 用数字替换符号

    我想读取一个文件并检测符号后面的字符是数字还是单词 如果是数字 我想删除它前面的符号 将数字翻译成二进制并替换在文件中 如果是一个单词 我想首先将字符设置为数字16 但随后 如果使用另一个单词 我想在原始数字上添加1 这就是我想要的 如果文
  • Android 使用包含另一个 hashmap 的 hashmap 实现 Parcelable 对象

    这是一个扩展Android 实现具有 hashmap 的 Parcelable 对象 https stackoverflow com questions 22498746 android implement parcelable objec
  • C# Java HashMap 等效项

    从 Java 世界进入 C 世界 是否有一个 HashMap 等价物 如果不是你会推荐什么 Dictionary https learn microsoft com en us dotnet api system collections g
  • LinkedHashMap 排序

    正如 LinkedHashMap 的 javadoc 中所指定的 如果将键重新插入到映射中 插入顺序不会受到影响 但在运行下面的程序时 我注意到在更改访问顺序时再次插入相同的键 Map
  • Java HashMap.clear()和remove()内存有效吗?

    考虑以下HashMap clear code Removes all of the mappings from this map The map will be empty after this call returns public vo
  • Guava 地图中的驱逐惰性

    当前的地图驱逐算法相当懒惰 看起来过期的对象只有在访问数据结构时才会被驱逐 例如 从地址到索引器的映射定义为 ConcurrentMap
  • Java、HashMap 和使用字符串作为键 - 字符串值是否会存储两次?

    如果我有一个如下所示的 HashMap HashMap
  • Java中如何从HashMap中获取对象

    我试图在给定密钥时从 HashMap 获取测试对象的速度 但我不太确定该怎么做 我尝试过这种方式 但它是错误的 hash values getSpeed 有什么帮助吗 谢谢 class Test private String id priv
  • 以 null 为键的 HashMap

    How HashMap内部区分null and 0作为关键 按照这个post https stackoverflow com questions 17268212 hashcode for null key in hashmap的哈希码nu
  • 按顺序范围循环映射

    我正在寻找一种确定的方法来范围Go map为了 Go 规范 https golang org ref spec For statements陈述如下 映射的迭代顺序未指定 并且不保证从一次迭代到下一次迭代的顺序相同 如果在迭代过程中删除尚未
  • Java HashMap - 深拷贝

    我只是想找出如何进行深层复制的最佳解决方案HashMap 该映射中没有对象实现Cloneable 我想找到比序列化和反序列化更好的解决方案 看一眼深度克隆 在 Google Code 上您可以找到一个库 你可以阅读它https github
  • Java HashMap 与 ArrayList 相比的内存开销

    我想知道java HashMap与ArrayList相比的内存开销是多少 Update 我想提高搜索一大包 600 万以上 相同对象的特定值的速度 因此 我正在考虑使用一个或多个HashMap来代替ArrayList 但我想知道 HashM
  • ANSI C 哈希表实现,数据位于一个内存块中

    我正在寻找一种哈希表的开源 C 实现 它将所有数据保存在一个内存块中 因此可以轻松地通过网络发送数据 我只能找到为添加到其中的每个键值对分配小块内存的内存 预先非常感谢您的所有投入 编辑 它不一定需要是哈希表 无论键值对表可能会做什么 序列

随机推荐

  • 配置VNC+PuTTY+SSH Tunnel访问Linux

    转自 http blog 163 com yunlei ma blog static 12720893520098492716722 配置VNC 43 PuTTY 43 SSH Tunnel访问Linux 2009 09 04 21 27
  • 如何在c/c++里输出系统时间

    include lt stdio h gt include lt time h gt void main time t rawtime struct tm timeinfo time amp rawtime timeinfo 61 loca
  • 控制台窗口操作

    用于控制台窗口操作的API函数如下 xff1a GetConsoleScreenBufferInfo 获取控制台窗口信息 GetConsoleTitle 获取控制台窗口标题 ScrollConsoleScreenBuffer 在缓冲区中移动
  • 图像增强?图像复原??

    图像增强的目标是改进图片的质量 xff0c 例如增加对比度 xff0c 去掉模糊和噪声 xff0c 修正几何畸变等 xff1b 图像复原是在假定已知模糊或噪声的模型时 xff0c 试图估计原图像的一种技术 图像增强按所用方法可分成频率域法和
  • SQL SERVER DATETIME 常用日期格式转换

    我们经常出于某种目的需要使用各种各样的日期格式 xff0c 当然我们可以使用字符串操作来构造各种日期格式 但是有现成的函数为什么不用呢 xff1f SQL Server中文版的默认的日期字段datetime格式是yyyy mm dd Thh
  • hadoop学习之自定义对象实现 writeable

    Hadoop虽然 已经实现了一些非常有用的Writable xff0c 如Text IntWritable NullWritable等 xff0c 但有时候需要构造一些更加复杂的结果存入context中 xff0c 使用这些方法可能就不是那
  • C语言宏的用法详解

    1 简介 宏在C语言中是一段有名称的代码片段 无论何时使用到这个宏的时候 xff0c 宏的内容都会被这段代码替换掉 主要有两种宏 xff0c 他们的区别主要是在使用上面 xff0c 一种是在使用时类似于数据对象称为Object like x
  • Linux--day04\05

    知识点和问题 1 Linux组基本介绍2 查看文件的所有者3 创建一个组police 再创建一个用户tom xff0c 将tom放在police中 xff0c 然后使用tom来创建ok txt文件 xff0c 看看情况如何 4 使用root
  • 如何在Ubuntu上运行.run文件

    在Ubuntu上运行 run文件 xff0c 有以下几个步骤 xff1a 1 打开一个终端 ctrl 43 alt 43 t 2 cd 到 run文件所在目录 3 输入 34 chmod 43 x foo run 34 4 输入 34 fo
  • /dev/tty、/dev/ttyS/、/dev/ttyUSB区别

    1 dev tty 当前控制终端Terminal 可以使用命令 ps ax 来查看进程与哪个控制终端相连 xff0c 使用命令 tty 可以查看它 具体对应哪个实际终端设备 2 dev ttyn和 dev console xff08 虚拟
  • 怎么解决你的Segmentation fault (core dumped)问题

    http westsoftware blog 163 com blog static 260941092011460252776 开发一个Linux Unix C C 43 43 程序的时候 xff0c 有时候会出现莫名的core dump
  • 前端生成图表

    http www cnblogs com skiler p 6679828 html 1 常用的前端生成图表的工具HighCharts和echarts 2 具体内容可参考官方文档 xff0c 有一些具体实例 xff0c JS和HTML的代码
  • C语言与C++的区别终于有人说清楚了!

    点击蓝字 关注我们 来源于网络 xff0c 侵删 1 前言 在很大程度上 xff0c C 43 43 是C的超集 xff0c 这意味着一个有效的C程序也是一个有效的C 43 43 程序 C和C 43 43 的主要区别是 xff0c C 43
  • python3,浅谈with的神奇魔法

    在实际的编码过程中 xff0c 有时有一些任务 xff0c 需要事先做一些设置 xff0c 事后做一些清理 xff0c 这时就需要python with出场了 xff0c with能够对这样的需求进行一个比较优雅的处理 xff0c 最常用的
  • archlinux安装配置vnc+openbox

    为什么用openbox xff0c 因为它很小 xff0c 占用资源少 够我用了 我用linux大部分只用命令行界面就够了 图形界面程序用的最多的也就是浏览器了 安装相关软件包 span class token comment 更新下系统
  • 安装vsftpd,并将用户锁定到家目录中,不能切换其他目录

    安装vsftpd span class token function rpm span ivh vsftpd 3 0 2 28 el7 x86 64 rpm 创建用户 span class token function useradd sp
  • c语言——http编程

    HTTP协议简介 超文本传输协议是一种用于分布式 协作式和超媒体信息系统的应用层协议 HTTP是一个客户端终端 xff08 用户 xff09 和服务器端 xff08 网站 xff09 请求和应答的标准 xff08 一般基于TCP xff09
  • 4、【STM32】蜂鸣器/按键实验

    目录 前言 理论学习 一 蜂鸣器简介 二 机械按键简介 三 GPIO配置简介 实践学习 一 设计规划 1 1 实验目标 1 2 硬件资源 二 程序设计 2 1 建立工程文件 2 2 led配置 2 3 beep配置 2 4 key配置 2
  • 多个线程ThreadLocal中存的是什么

    之前所学不精 xff0c 现在看一下确实是 xff0c 我ThreadLocal里如果都存的是一个共享变量的话 xff0c 那么肯定是会两边都相同的 其实现在回头看这些代码就没有了当初学术不精时候的疑惑了 xff0c 反正也被喷了 xff0
  • HashMap的indexFor方法

    关于HashMap中的IndexOf方法原来一直没有想通为什么用 amp 并且和length 1做运算 xff0c 今天琢磨了一下 static int indexFor int h int length return h amp leng