首页 > 其他分享 >HashMap 的长度为什么是2的幂次方?

HashMap 的长度为什么是2的幂次方?

时间:2024-08-30 20:25:53浏览次数:13  
标签:下标 HashMap 二进制 哈希 操作 次方 长度

一、均匀分布哈希值 当 HashMap 的长度是 2 的幂次方时,通过 hashCode()计算出哈希值后,再与(length - 1)进行与操作(例如 index = hashCode() & (table.length - 1)),可以使得哈希值更加均匀地分布在数组的下标范围内。 假设哈希值是均匀分布的,那么与操作可以充分利用哈希值的各个位,将哈希值映射到不同的下标位置。例如,如果长度为 16(二进制为 10000),那么与操作会根据哈希值的低四位来确定下标,这样可以使不同的哈希值更有可能映射到不同的下标位置,减少哈希冲突。
因为hash值是不固定的,所以说key的hash值的二进制数任何位都可能是0或1,如果要保证减少hash碰撞,并且充分占据每个数组的位置,就必须要保证(数组大小-1)的二进制全是1,例如(16-1)的二进制是1111。这样的话,就能保证最后的运算结果,完全取决于hash的二进制数,也就是最后的结果会保证每个位都有可能是0或1。 对于十进制数而言,2的幂次方数-1的二进制数全都是1。

二、优化计算效率 与操作(&)比取模操作(%)效率更高
在计算下标时,如果长度是 2 的幂次方,那么与操作等价于取模操作,但与操作在计算机硬件层面上通常可以更快地执行。 取模操作可能涉及到除法和余数计算,相对比较耗时。而与操作只需要对二进制位进行简单的逻辑运算,执行速度更快。
三、便于扩容操作 当 HashMap 需要扩容时。
如果长度是 2 的幂次方,扩容后的新长度也是 2 的幂次方,并且只需要将旧的哈希值与新的长度减 1 进行与操作,就可以快速地重新计算元素在新数组中的位置。 这种方式可以避免复杂的重新哈希过程,提高扩容的效率。例如,从长度为 16 扩容到 32,旧的哈希值与 15(1111)进行与操作得到旧下标,新的哈希值与 31(11111)进行与操作得到新下标,这个过程相对简单高效。

标签:下标,HashMap,二进制,哈希,操作,次方,长度
From: https://blog.csdn.net/2301_80114420/article/details/141677982

相关文章

  • 信奥一本通题南沙陈老师解题 1058:求一元二次方程
     【题目描述】【输入】输入一行,包含三个浮点数a,b,ca,b,c(它们之间以一个空格分开),分别表示方程ax2+bx+c=0ax2+bx+c=0的系数。【输出】输出一行,表示方程的解。若两个实根相等,则输出形式为:“x1=x2=...x1=x2=...”;若两个实根不等,在满足根小者在前的原则,则输出形式......
  • sha-256算法,生成固定长度的字符串
    SHA-256(安全哈希算法256位)是一种广泛使用的加密哈希函数,它会将输入的任意大小的数据转换为固定长度的256位(32字节)哈希值。SHA-256是SHA-2系列算法的一部分,由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布。SHA-256的主要特点包括:固定长度输出:无论输入数据的......
  • Encoding.Default.GetByteCount(),C# 获取字符串字节长度
    原文链接:https://blog.csdn.net/lidin888/article/details/127674079一、C#获取字符串字节长度1.在C#语言中使用string字符串Unicode编码2.在C#语言中常用汉字占3个字节方式1:使用默认编码类获取字节长度Console.WriteLine(Encoding.Default.GetByteCount("张三"));//输......
  • 代码随想录算法训练营,29日 | 704. 二分查找,27. 移除元素,977.有序数组的平方,209.长度最
    数组基础文档讲解︰代码随想录(programmercarl.com)1.连续空间、相同类型元素2.元素只能覆盖3.二维数组的地址连续吗(C++连续,Java不连续)704.二分查找题目链接:704.二分查找文档讲解︰代码随想录(programmercarl.com)视频讲解︰二分查找日期:2024-08-29思路:第一反应是想到二分查......
  • 2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount
    2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,val)可以返回数组arr中大于val的元素数量。按照以下规则进行n次操作,将nums中的元素分配到两个数组arr1和arr2中:1.第一次操作将nums[1]加入arr1。2.第二次操作将nums[2]加入arr2。3.对......
  • Python-解三元一次方程(Part.2)
    一、需要解的方程组为:x+y+z=26x-y=12x-y+z=18 二、下面进入代码实现:1、导入Sympy库中的符号、方程和求解函数fromsympyimportsymbols,Eq,solve 2、定义变量x,y,z=symbols('xyz') 3、定义方程组#方程1:x+y+z=26eq1=Eq(......
  • 求一元二次方程的根
    描述利用公式x1=(-b+sqrt(b*b-4*a*c))/(2*a),x2=(-b-sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+bx+c=0的根,其中a不等于0。输入输入一行,包含三个浮点数a,b,c(它们之间以一个空格分开),分别表示方程ax2 +bx+c=0的系数。输出输出一行,表示方程的解。若b2 =......
  • 本题目要求一元二次方程ax^2+bx+c=0的根,结果保留2位小数。
    /*题目描述本题目要求一元二次方程ax^2+bx+c=0的根,结果保留2位小数。 输入输入在一行中给出3个浮点系数a、b、c,中间用空格分开。输入在一行中给出2个正整数A和B。输出根据系数情况,输出不同结果:1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;2)如果方程有两个......
  • 如何缩短微信文章链接长度
    有时候,我们想把微信公众号的文章发到其他平台上,这时候就需要复制文章的链接。‍手机端复制方式如下:​‍微信对于短网址的优化以前,微信公众号文章的链接特别长。但在2016年末,微信悄悄做了更新,链接网址变短了许多:​此时两个网址都能打开同一篇文章。这是个小小的改变,但非......
  • 2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。 你需
    2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组nums,数组长度为n。你需要按照以下规则进行n次操作,将数组nums中的所有元素分配到两个新数组arr1和arr2中:1.首先将nums中第一个元素加入arr1。2.然后将nums中第二个元素加入arr2。3.如果arr1的最后一......