当前位置: 首页 > news >正文

hsahmap的寻址算法和为是你扩容为2的N次方

```markdown
HashMap寻址算法详解
HashMap的寻址算法是其高效存取的核心机制,通过哈希计算与位运算实现键值对的快速定位。以下是其核心原理与实现细节:
---
一、寻址流程的核心步骤
1. 计算键的哈希值
- 原始哈希值获取:调用键对象的`hashCode()`方法,获取32位整数哈希值。
- 扰动函数处理:对原始哈希值进行高低位异或操作,减少哈希冲突:
```java
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```
作用:将高16位与低16位混合,使哈希值分布更均匀,避免因低16位相似导致的冲突。
2. 计算数组下标
- 按位与运算:将扰动后的哈希值与数组长度减1进行按位与操作:
```java
int index = (n - 1) & hash;
```
- 原理:当数组长度`n`为2的幂次方时,`(n-1)`的二进制全为1(如`n=16`时`n-1=15`,二进制`1111`),此时`hash & (n-1)`等价于`hash % n`,但位运算性能更高。
- 示例:若哈希值为`3029737`(二进制`1011100011101011101001`),数组长度`n=16`,则下标为`(16-1) & 3029737 = 9`。
---
二、数组长度必须为2的幂次方的原因
1. 保证均匀分布
- 二进制掩码特性:当`n`为2的幂时,`n-1`的二进制低位全为1(如`n=16`时`n-1=15`,二进制`1111`),与哈希值按位与后能充分利用低位信息,减少冲突。
- 避免空间浪费:若`n`非2幂(如`n=9`),`n-1=8`(二进制`1000`),运算后仅保留最高位,导致多个哈希值映射到同一位置(如`3 & 8=0`,`2 & 8=0`)。
2. 支持高效扩容
- 扩容规则:每次扩容为原长度的2倍(如16→32),新下标仅可能为原下标或原下标 + 旧容量。
- 快速定位新位置:通过`(e.hash & oldCap) == 0`判断,无需重新哈希:
- 若结果为0,下标不变;
- 若结果为1,下标 = 原下标 + 旧容量。
---
三、哈希冲突的处理机制
1. 链表法(JDK 1.7及之前)
- 冲突元素存储:将哈希值相同的键值对以链表形式存储在同一个数组位置。
- 性能问题:链表过长时查询退化为O(n)。
2. 红黑树优化(JDK 1.8起)
- 树化条件:当链表长度≥8且数组长度≥64时,链表转为红黑树(查询复杂度O(logn))。
- 退化条件:当红黑树节点数≤6时,退化为链表。
---
四、实际应用中的注意事项
1. 初始容量设置
- 自动调整:若指定非2幂容量(如10),HashMap会自动调整为最近的2幂(如16),避免空间浪费和冲突增加。
2. 键对象的`hashCode()`与`equals()`
- 重写要求:
- `hashCode()`决定哈希值,影响寻址效率;
- `equals()`用于判断键是否相等,需保证一致性。
---
五、总结
HashMap的寻址算法通过扰动函数优化哈希值 + 按位与运算替代取模,结合2的幂次方数组长度,实现了高效的定位与扩容机制。其设计核心在于平衡时间效率(O(1)查询)与空间利用率,同时通过红黑树优化极端情况的性能。
```

 

http://www.dtcms.com/a/390270.html

相关文章:

  • ​​[硬件电路-243]:电源纹波与噪声
  • Kurt-Blender零基础教程:第1章:基础篇——第2节:认识界面
  • Kurt-Blender零基础教程:第1章:基础篇——第1节:下载与键位
  • 袋鼠参谋 - 美团推出的餐饮行业经营决策 AI 助手
  • 09-Redis 哈希类型深度解析:从命令实操到对象存储场景落地
  • 【论文阅读】MaskGIT: Masked Generative Image Transformer
  • Maya绑定基础知识总结合集:父子关系和父子约束对比
  • 从假设检验到数据驱动决策:统计推断的技术实战与方法论深度拆解
  • 基于PyTorch Geometric的图神经网络预训练模型实现
  • UniTask在Webgl上报错的记录
  • 供应链场景下Oracle分库分表案例架构及核心代码分析
  • 【leetcode】59. 螺旋矩阵 II
  • Discord+ChatGPT?如何利用AI打造海外私域社群?
  • 概率论强化大观
  • 数据结构——单链表(c语言笔记)
  • 【系列文章】Linux系统中断的应用05-延迟工作
  • Cannot find module ‘@ohos/ohoszxing‘ 和安装ohoszxing 的第三方库
  • Intelligent parking
  • 【试题】数据安全管理员考试题目
  • linux中的redis
  • 工作笔记-----stm32随机数发生器RNG配置问题
  • SQL中NTILE函数的用法详解
  • Rokid乐奇成为国礼的秘密,是握住美好数字生活的定义权
  • 基于 3D 高斯泼溅的重建 (3DGS-based)
  • Gin 集成 Redis:从连接到实战
  • python-asyncio与事件循环(Event Loop)
  • 100道经典C语言笔试题(前15道)
  • MySQL Binlog 实时监控与数据插入示例
  • SQL Server运维实战指南:从监控到优化的完整路径
  • 2025年09月18日Github流行趋势