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

Java高频面试之集合-12

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:HashMap 的 hash 函数是怎么设计的?

HashMap的hash函数设计核心在于减少碰撞、提高数据分布均匀性,具体实现分为以下步骤:

1. 扰动函数处理

对键的原始hashCode进行高位与低位异或,增加低位随机性:

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
  • 作用:将hashCode的高16位右移后与低16位异或,使得高位信息参与低位运算,避免仅依赖低位导致碰撞率升高。

2. 下标计算

通过(n-1) & hash确定数组索引:

  • n为2的幂(如默认16),n-1的二进制全为1(例如15对应1111),位与操作等效于取模运算(但效率更高)。
  • 优势:位运算比取模快,且保证下标均匀分布在数组范围内。

3. 碰撞优化

  • 链表与红黑树:当链表长度≥8时转为红黑树(查找时间复杂度O(log n)),长度≤6时恢复链表,平衡性能与空间。
  • 扩容机制:负载因子默认0.75,当元素数超过阈值时扩容为原数组2倍,重新分配元素位置。

关键设计思想

设计要点实现方式作用
高位扰动异或操作(h ^ (h >>> 16))减少低位重复导致的碰撞
高效取模位运算((n-1) & hash)替代取模运算,提高速度
动态数据结构链表(O(n))与红黑树(O(log n))自动转换避免极端情况下性能退化
负载因子默认0.75(空间与时间折中)控制扩容阈值,平衡内存使用率和查询效率

示例说明

假设键的hashCode为0x12345678,数组长度n=16:

  1. 扰动计算0x12345678 ^ (0x12345678 >>> 16) = 0x12345678 ^ 0x00001234 = 0x1234444C
  2. 确定下标(16-1) & 0x1234444C = 15 & 0x444C = 12(最终存储到数组第12个位置)。

通过这种设计,HashMap在大多数情况下能高效处理数据插入与查询,同时保持较低的碰撞概率。

在这里插入图片描述

相关文章:

  • 「BigBig AGI 1.0 Demo 」来袭!揭示 AI 灵魂奥秘
  • STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步
  • WebSocket与MQTT协议深度对比:选择合适的通信协议
  • 行为模式---模版模式
  • pjsip pjsua_media_config 结构体说明
  • CentOS7 服务器安装 Hadoop 和 Hive
  • 数组的介绍
  • ios 小组件和数据共享
  • 浅谈StarRocks数据库简介及应用
  • 插入排序算法的SIMD优化
  • 地下停车场调频广播覆盖:破解地下车库无线广播收听孤岛,技术赋能地下停车场FM调频无线广播覆盖
  • PixelCNN:基于自回归的图像生成模型及其数学原理
  • spring boot3 kafka集群搭建到使用
  • AI大模型测试用例生成平台
  • mysql 到 doris 挪移数据
  • IDEA中链接使用mysql数据库
  • 如何在 React 中实现错误边界?
  • 一场因黄焖鸡引发的技术方案大作战
  • js版本之ES12(2021)、ES13(2022)新特性(九)
  • 封装Axios拦截器实现用户无感刷新AccessToken实践指南
  • 六连板成飞集成:航空零部件业务收入占比为1.74%,市场环境没有重大调整
  • 微软将裁员3%,减少管理层
  • 沧州制造展现硬核实力:管道装备支撑大国基建,核电锚栓实现国产
  • 美国明尼苏达州发生山火,过火面积超80平方公里
  • 李强会见巴西总统卢拉
  • 安徽省委副秘书长、省委政研室主任余三元调任省社科院院长