HashMap中put()方法的执行流程

HashMap 是 Java 中最常用的数据结构之一,用于存储键值对。其 put() 方法是向哈希表中插入或更新键值对的核心操作。本文将详细解析 put() 方法的执行过程,涵盖哈希值计算、桶定位、冲突处理和扩容等步骤。


一、put() 方法的执行过程

put() 方法通过一系列步骤实现键值对的高效存储和更新。以下是详细的执行流程:

1. 计算键的哈希值

  • 步骤:HashMap 首先调用键的 hashCode() 方法获取其哈希码。
  • 扰动处理:为了减少哈希冲突,HashMap 对哈希码进行扰动处理,具体通过 (h = key.hashCode()) ^ (h >>> 16),将高 16 位与低 16 位进行异或操作,增加哈希值的随机性。
  • 特殊情况:如果键为 null,哈希值固定为 0(HashMap 允许一个 null 键)。

2. 确定桶位置

  • 计算索引:使用哈希值通过公式 index = hash & (table.length - 1) 计算键值对在数组(桶)中的索引位置。
  • table 初始化:table 是 HashMap 内部用于存储节点的数组。如果 table 未初始化(即 table == null 或 table.length == 0),会调用 resize() 方法初始化数组。

3. 处理桶中的情况

根据目标桶(table[index])的状态,put() 方法会执行不同的逻辑:

情况 1:桶为空
  • 如果桶中没有节点,直接创建一个新的 Node(包含键、值、哈希值等信息)并放入该桶。
情况 2:桶中已有节点
  • 3.2.1 检查第一个节点
    • 如果桶中第一个节点的键与插入的键相同(通过哈希值比较和 equals() 方法确认),直接更新该节点的值。
  • 3.2.2 处理红黑树
    • 如果桶中节点数量较多(超过 TREEIFY_THRESHOLD,默认为 8),且桶已转为红黑树结构,调用红黑树的插入方法(putTreeVal)处理插入或更新。
  • 3.2.3 处理链表
    • 如果桶中是链表结构,遍历链表:
      • 如果找到键相同的节点,更新其值。
      • 如果没有找到相同键,将新节点添加到链表末尾。
    • 插入后,如果链表长度大于等于8且数组长度达到64时,调用 treeifyBin() 将链表转换为红黑树。
情况 3:桶中键为 null
  • 如果插入的键为 null,存储到索引为 0 的桶中(HashMap 只允许一个 null 键)。

4. 更新大小和检查扩容

  • 更新 size:插入新键值对后,HashMap 的 size(键值对数量)加 1。
  • 检查扩容:如果 size 超过阈值(threshold = table.length * loadFactor,默认负载因子为 0.75),触发 resize() 方法进行扩容。
  • 扩容:将数组的容量扩大为原来的2倍。

5. 返回旧值

  • 如果插入的键已存在,put() 方法返回该键对应的旧值。
  • 如果是新插入的键值对,返回 null。

二、核心代码分析

以下是 put() 方法的核心逻辑:

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);
}// 计算哈希值
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}// putVal 核心实现
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;// 如果 table 未初始化,调用 resize()if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;// 计算索引,检查桶是否为空if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null); // 直接插入新节点else {Node<K,V> e; K k;// 检查第一个节点是否匹配if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))e = p;// 如果是红黑树,调用树插入逻辑else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);// 遍历链表else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null); // 插入到链表末尾// 检查是否需要转为红黑树if (binCount >= TREEIFY_THRESHOLD - 1)treeifyBin(tab, hash);break;}// 找到相同键if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}// 如果找到已有键,更新值if (e != null) {V oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}// 增加 size,检查是否需要扩容if (++size > threshold)resize();afterNodeInsertion(evict);return null;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Oracle认证】MySQL 8.0 OCP 认证考试英文版(MySQL30 周年版)

文章目录 1、MySQL OCP考试介绍2、考试注册流程3、考试复习题库 Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到2025.07.31 之前。所有人均可以免费考取原价245美元 &#xff08;约1500&#xff09;的MySQL OCP 认证。 1、MySQL OCP考试介绍 OCP考试 OCP认证是Oracle公司推…

SpringBoot框架开发网络安全科普系统开发实现

概述 基于SpringBoot框架的网络安全科普系统开发指南&#xff0c;该系统集知识科普、案例学习、在线测试等功能于一体&#xff0c;本文将详细介绍系统架构设计、功能实现及技术要点&#xff0c;帮助开发者快速构建专业的网络安全教育平台。 主要内容 系统功能架构 本系统采…

浏览器HTTP错误、前端常见报错 和 Java后端报错

以下是 浏览器HTTP错误、前端常见报错 和 Java后端报错 的综合整理&#xff0c;包括原因和解决方法&#xff0c;帮助你快速排查问题。 一、HTTP 错误&#xff08;浏览器报错&#xff09; 错误码原因解决方法400 Bad Request请求语法错误&#xff08;如参数格式错误、请求体过…

TypeScript简介

&#x1f31f; TypeScript入门 TypeScript 是 JavaScript 的超集&#xff0c;由微软开发并维护&#xff0c;通过静态类型检查和现代语言特性&#xff0c;让大型应用开发变得更加可靠和高效。 // 一个简单的 TypeScript 示例 interface User {name: string;age: number;greet():…

[ctfshow web入门] web57

信息收集 这下把.也过滤了&#xff0c;临时文件上传无法使用了 //flag in 36.php if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/\;|[a-z]|[0-9]|\|\|\#|\|\"|\|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\|\[/i", $c)){system("cat ".$c…

Android 移动应用开发:页面跳转与数据传递功能

目录 ✅ 运行效果说明 &#x1f4c1; 文件一&#xff1a;MainActivity.java&#xff08;语言&#xff1a;Java&#xff09; &#x1f4c1; 文件二&#xff1a;Edit_MainActivity.java&#xff08;语言&#xff1a;Java&#xff09; &#x1f4c1; 文件三&#xff1a;activi…

MySQL如何优雅的执行DDL

一、概述 在MySQL中&#xff0c;DDL&#xff08;数据定义语言&#xff09;语句用于定义和管理数据库结构&#xff0c;包括创建、修改和删除数据库对象&#xff08;如表、索引等&#xff09;。执行DDL操作时&#xff0c;需要谨慎处理&#xff0c;以避免对生产环境的稳定性和性能…

onenet连接微信小程序(mqtt协议)

一、关于mqtt协议 mqtt协议常用于物联网&#xff0c;是一种轻量级的消息推送协议。 其中有三个角色&#xff0c;Publisher设备&#xff08;客户端&#xff09;发布主题到服务器&#xff0c;其他的设备通过订阅主题&#xff0c;获取该主题下的消息&#xff0c;Publisher可以发…

【Unity笔记】实现支持不同渲染管线的天空盒曝光度控制组件(SkyboxExposureController)——参数化控制

写在前面 在Unity中&#xff0c;天空盒&#xff08;Skybox&#xff09;不仅承担视觉上的背景作用&#xff0c;更是场景环境光照与氛围塑造的重要组成部分。不同时间、天气、场景转换等&#xff0c;都需要灵活调整天空的亮度。而**曝光度&#xff08;Exposure&#xff09;**就是…

blender云渲染指南2025版

一、云渲染核心概念 Blender云渲染是将本地渲染任务迁移到云端服务器集群的技术&#xff0c;通过分布式计算实现效率提升100倍以上的解决方案&#xff0c;其核心逻辑是&#xff1a;用户上传Blender项目文件至【渲染101】等云平台&#xff0c;云端调用高性能服务器&#xff08;…

火语言RPA--七牛云存储

【组件功能】&#xff1a;存储本地文件至七牛云 选择本地文件&#xff0c;通过七牛云存储配置上传至七牛云对象存储的指定地域指定存储桶指定路径。 配置预览 配置说明 AccessKey 支持T或# 前往官网获取或创建。参考链接&#xff1a;https://portal.qiniu.com/user/key Se…

小刚说C语言刷题—1004阶乘问题

1.题目描述 编程求 123⋯n 。 输入 输入一行&#xff0c;只有一个整数 n(1≤n≤10)&#xff1b; 输出 输出只有一行&#xff08;这意味着末尾有一个回车符号&#xff09;&#xff0c;包括 1 个整数。 样例 输入 5 输出 120 2.参考代码(C语言版) #include <stdio…

C语言| sizeof(array)占多少字节

C语言| 数组名作为函数参数 sizeof(数组名); 可以求出整个数组在内存中所占的字节数。 被调函数Array_Sum()中&#xff0c;数组array使用sizeof会得到多少&#xff1f; 实参数组a占32字节&#xff0c;实参a传给形参array&#xff0c;只占4字节。 原因如下&#xff1a; 数组名做…

Xcavate 上线 Polkadot |开启 Web3 房地产投资新时代

在传统资产 Tokenization 浪潮中&#xff0c;Xcavate 以房地产为切口迅速崛起。作为 2023 年 OneBlock 冬季波卡黑客松冠军&#xff0c;Xcavate 凭借创新的资产管理与分发机制&#xff0c;在波卡生态中崭露头角。此次主网上线&#xff0c;标志着 Xcavate 正式迈入全球化应用阶段…

学习心得《How Global AI Policy and Regulations Will Impact Your Enterprise》Gartner

AI时代来临,然而与之对应的是海量的数据的安全性和合规性如何保障,如何平衡个人与智能体的利益,恰巧,最近Gartner发布了《How Global AI Policy and Regulations Will Impact Your Enterprise》,我们就其中的观点一起进行探讨。 战略规划假设 我们首先关注的是关键的战略…

Inno Setup专业打包指南:从基础到高级应用

Inno Setup专业打包指南&#xff1a;从基础到高级应用 Inno Setup是一款免费开源的Windows安装程序制作工具&#xff0c;以其轻量、易用、功能强大而备受开发者青睐。它通过脚本语言定义安装行为&#xff0c;能够创建标准的Windows安装向导&#xff0c;支持文件安装、注册表操…

VScode中关于Copilot的骚操作

目录 1. Ctrl I 直接在工作区对话 2.Tab 党福音&#xff1a;写注释生成代码 3. 连续写几行函数头&#xff0c;Copilot 会自动“补全全函数” 4. 自动写单元测试 5. 在注释中要求它写某种风格 6. 代码重写器 7. 多语言切换无痛自动翻译 8. 在空文件中写注释&#xff0c…

虚拟专用服务器(VPS)完全指南:从入门到选型

开篇导读 VPS&#xff08;虚拟专用服务器&#xff09;作为介于共享主机与独立服务器之间的托管方案&#xff0c;通过独享资源保障性能本文将系统解析VPS的核心优势、适用场景及选型策略&#xff0c;助您实现从共享主机到VPS的平滑过渡 什么是虚拟专用服务器&#xff1f; 服务…

前端取经路——性能优化:唐僧的九道心经

大家好&#xff0c;我是老十三&#xff0c;一名前端开发工程师。性能优化如同唐僧的九道心经&#xff0c;是前端修行的精髓所在。在本文中&#xff0c;我将为你揭示从网络传输到渲染优化的九大关键技术&#xff0c;涵盖HTTP协议、资源加载策略、缓存控制等核心难题。通过这些实…

[论文阅读]Deeply-Supervised Nets

摘要 我们提出的深度监督网络&#xff08;DSN&#xff09;方法在最小化分类误差的同时&#xff0c;使隐藏层的学习过程更加直接和透明。我们尝试通过研究深度网络中的新公式来提升分类性能。我们关注卷积神经网络&#xff08;CNN&#xff09;架构中的三个方面&#xff1a;&…