HashMap 深入揭秘:从入门到大厂必备知识!

简介: 大家好,我是小米,29岁程序员。今天用讲故事的方式详解Java面试经典问题:“HashMap的实现原理”。HashMap通过哈希算法快速存取数据,底层由数组和链表/红黑树组成,解决哈希冲突。容量、负载因子等字段控制性能,扩容机制提升效率。HashMap非线程安全,多线程场景建议使用ConcurrentHashMap。合理设置初始容量、重写hashCode()和equals()方法可优化性能。希望这篇文章能帮助你更好地理解HashMap!欢迎点赞、分享,关注我的公众号“软件求生”获取更多技术干货。



Hi,大家好,我是小米,一个喜欢分享技术的29岁程序员。今天和大家聊聊一个在Java面试中非常经典的问题:“说一下 HashMap 的实现原理?”。别着急,我会用讲故事的方式,把它掰开了揉碎了讲清楚,让你听完之后,再也不怕这个问题!

故事的开头:一个简单的需求

一天,产品经理找到你,说用户需要存储一组“键值对”,并且希望能通过“键”快速找到对应的“值”。作为一个有经验的开发者,你第一时间就想到了Java里的HashMap,对吧?

HashMap 就像是一个超级高效的存储工具,它的核心理念是:通过哈希算法定位存储位置,快速存取数据。接下来,我们就一起探讨它的实现原理。

HashMap 的基本构造

1. 底层数据结构

HashMap 的底层是由一个数组和多个链表/红黑树组成的。这种结构有个专业名词,叫做“拉链法”。我们可以把它想象成一个巨大的仓库,里面有许多货架,每个货架上又挂了很多小篮子:

  • 数组:仓库的货架,负责存储数据的入口;
  • 链表/红黑树:每个篮子,存储可能冲突的键值对。

2. 核心字段

HashMap 有几个非常重要的字段,分别是:

  • 容量(capacity):数组的大小,默认是16;
  • 负载因子(loadFactor):控制数组什么时候扩容,默认是0.75;
  • 阈值(threshold):容量 × 负载因子,当元素个数超过这个值时,就需要扩容。

如何存储数据?

当我们调用 put(K key, V value) 方法时,HashMap 会经历以下几个步骤:

1. 计算哈希值

通过 key 的 hashCode() 方法计算哈希值,并通过一个位运算 h & (n - 1) 确定该数据应该存储到数组的哪个索引上。

为什么不用取模,而用位运算呢?

因为位运算比取模快很多,尤其是在需要高性能的场景下。

2. 定位桶(Bucket)

找到数组的对应位置,查看这个位置上是否已经有数据:

  • 如果没有数据,直接存储;
  • 如果已经有数据,则发生了哈希冲突

3. 解决哈希冲突

哈希冲突是不可避免的,HashMap 通过两种方式来解决:

  • 链表:在同一个索引处存储多个键值对;
  • 红黑树:当链表的长度超过8时,会转化为红黑树,提升查找效率。

4. 插入数据

将新的键值对插入到对应的链表或红黑树中。如果 key 已经存在,会覆盖旧的 value。

如何取出数据?

当我们调用 get(K key) 方法时,HashMap 会进行以下操作:

1. 再次计算哈希值

通过 key 的 hashCode() 方法计算哈希值,定位到数组的某个索引。

2. 查找桶内数据

  • 进入桶中,依次遍历链表或红黑树:
  • 如果找到对应的 key,就返回 value;
  • 如果遍历完没有找到,返回 null。

注意:这里的 key 比较是通过 equals() 方法完成的。

扩容机制

当 HashMap 的元素数量超过阈值(capacity × loadFactor)时,就会触发扩容:

  • 数组的大小变为原来的两倍;
  • 重新计算每个键值对的哈希值,并放入新的数组中。

扩容是个性能开销较大的操作,所以在使用 HashMap 时,我们通常会预估大小,尽量减少扩容次数。

故事的高潮:面试官的深挖

当你讲完上述内容,面试官可能会进一步问你一些细节问题:

1. 为什么数组大小是2的幂次?

因为 h & (n - 1) 的位运算只有在数组大小是2的幂次时,才能均匀分布哈希值,减少冲突。

2. 红黑树是如何提高效率的?

链表的时间复杂度是 O(n),而红黑树的查找复杂度是 O(log n)。当链表太长时(超过8),会自动转化为红黑树,显著提高查找效率。

3. HashMap 是线程安全的吗?

HashMap 不是线程安全的。如果在多线程环境下使用,可以考虑使用 ConcurrentHashMap。

故事的结尾:小技巧

最后,分享几个关于 HashMap 的小技巧:

  • 合理设置初始容量:避免频繁扩容,提升性能;
  • 重写 hashCode() 和 equals() 方法:确保键的哈希值均匀分布,减少冲突;
  • 多线程场景用 ConcurrentHashMap:避免线程安全问题。

END

写到这里,关于 HashMap 的实现原理,我们就聊到这里啦!希望通过这个故事,你对 HashMap 的理解能更上一层楼。如果你觉得这篇文章有帮助,记得点个 或分享给朋友哦!下次再见啦,拜拜~

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关文章
|
9天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
179604 21
|
1天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
对话 | ECS如何构筑企业上云的第一道安全防线
|
18天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
9518 25
|
4天前
|
机器学习/深度学习 分布式计算 供应链
阿里云先知安全沙龙(上海站) ——大模型基础设施安全攻防
大模型基础设施的安全攻防体系涵盖恶意输入防御和基础设施安全,包括框架、三方库、插件、平台、模型和系统安全。关键漏洞如CVE-2023-6019(Ray框架命令注入)、CVE-2024-5480(PyTorch分布式RPC)及llama.cpp中的多个漏洞,强调了代码安全性的重要性。模型文件安全方面,需防范pickle反序列化等风险,建议使用Safetensors格式。相关实践包括构建供应链漏洞库、智能化漏洞分析和深度检测,确保全方位防护。
|
6天前
|
JSON 分布式计算 数据处理
加速数据处理与AI开发的利器:阿里云MaxFrame实验评测
随着数据量的爆炸式增长,传统数据分析方法逐渐显现出局限性。Python作为数据科学领域的主流语言,因其简洁易用和丰富的库支持备受青睐。阿里云推出的MaxFrame是一个专为Python开发者设计的分布式计算框架,旨在充分利用MaxCompute的强大能力,提供高效、灵活且易于使用的工具,应对大规模数据处理需求。MaxFrame不仅继承了Pandas等流行数据处理库的友好接口,还通过集成先进的分布式计算技术,显著提升了数据处理的速度和效率。
|
22天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
5158 15
资料合集|Flink Forward Asia 2024 上海站
|
1月前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
14天前
|
Docker 容器
|
2天前
|
机器学习/深度学习 人工智能 安全
通义视觉推理大模型QVQ-72B-preview重磅上线
Qwen团队推出了新成员QVQ-72B-preview,这是一个专注于提升视觉推理能力的实验性研究模型。提升了视觉表示的效率和准确性。它在多模态评测集如MMMU、MathVista和MathVision上表现出色,尤其在数学推理任务中取得了显著进步。尽管如此,该模型仍存在一些局限性,仍在学习和完善中。
|
17天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
1323 76