HashMap1.8源码级分析put()方法

news2024/10/11 12:25:31

HashMap的put方法用于将指定的键-值对存入HashMap中。如果指定的键已经存在,则更新其对应的值。

public V put(K key, V value)

方法实现

以下是Java 8中HashMap put方法的一个简化版源码分析:

  1. 检查并处理空值
    HashMap不允许键或值为null。如果尝试插入null键或值,会抛出NullPointerException

  2. 计算键的哈希值
    使用键的hashCode()方法计算其哈希值,并通过内部的一个方法hash()对哈希值进行再次哈希,以减少哈希冲突。

 final int hash = Objects.hashCode(key) ^ (Objects.hashCode(127) * 16);
注意:这里的^是位异或运算符,127是一个常量,用于生成一个额外的哈希值。

     3.定位桶位置
        使用哈希值和数组长度-1进行按位与运算,得到该键应该存放在哪个桶(数组索引)中

int index = (hash & (table.length - 1)); 

 4.处理冲突

        如果桶中已经存在元素,则需要进行冲突解决。Java 8及更高版本的HashMap使用链表和红黑树结合的方式来解决冲突(即当链表长度超过一定阈值时,将链表转换为红黑树以提高查找效率)。如果桶中元素是链表,则遍历链表,检查是否存在相同的键。如果存在,则更新值;如果不存在,则在链表尾部添加新节点。

如果桶中元素是红黑树,则使用红黑树的插入操作来添加或更新节点。

5.扩容

        在插入新元素后,如果HashMap的容量超过了阈值(即当前容量*加载因子),则需要进行扩容操作。扩容操作会创建一个新的数组,并将旧数组中的元素重新哈希后存入新数组中

6.返回值:返回之前与指定键关联的值(如果键之前不存在,则返回null)。

示例代码

public V put(K key, V value) {  
    return putVal(hash(key), key, value, false, true);  
}  
  
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {  
    Node<K,V>[] tab;  
    Node<K,V> p;  
    int n, i;  
    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) // -1 for 1st  
                        treeifyBin(tab, i);  
                    break;  
                }  
                if (e.hash == hash &&  
                    ((k = e.key) == key || (key != null && key.equals(k))))  
                    break;  
                p = e;  
            }  
        }  
        if (e != null) { // existing mapping for key  
            V oldValue = e.value;  
            if (!onlyIfAbsent || oldValue == null)  
                e.value = value;  
            afterNodeAccess(e);  
            return oldValue;  
        }  
    }  
    modCount++;  
    size++;  
    afterNodeInsertion(evict);  
    return null;  
}

关键点总结

  1. 哈希计算:使用键的hashCode()方法和内部哈希函数来计算哈希值。
  2. 桶定位:通过哈希值与数组长度-1的按位与运算来确定桶的位置。
  3. 冲突解决:使用链表或红黑树来解决哈希冲突。
  4. 扩容:当容量超过阈值时,进行扩容操作。
  5. 返回值:返回之前与指定键关联的值(如果键之前不存在,则返回null)。

通过深入理解HashMap的put方法,我们可以更好地使用HashMap,并在遇到性能问题时进行针对性的优化。

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

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

相关文章

springboot宠物托管平台-计算机毕业设计源码82186

摘要 随着人们生活水平的提高&#xff0c;宠物已经成为越来越多家庭的重要成员。然而&#xff0c;由于工作、旅行等原因&#xff0c;宠物主人在某些时候可能无法亲自照顾宠物&#xff0c;因此宠物托管服务应运而生。本文旨在设计并实现一个基于Spring Boot框架的宠物托管平台&a…

YOLOv8模型改进 第六讲 添加多尺度卷积注意力模块(MSCAM)

在计算机视觉领域&#xff0c;目标检测的准确性和效率是研究的热点之一。YOLOv8 作为最新一代的实时目标检测模型&#xff0c;已经在多个基准数据集上展示了其优越的性能。然而&#xff0c;随着数据集和应用场景的复杂性增加&#xff0c;如何进一步提升模型的检测精度和鲁棒性仍…

Kafka之基本概念

1、Kafka是什么&#xff1f; Kafka是由Scala语言开发的一个多分区、多副本&#xff0c;基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢&#xff1f; 回答这个问题要从发展的角度来看&#xff1a;起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…

用户代理样式表:你真的了解它吗?

引言 作为一名前端开发者&#xff0c;你是否曾经遇到过这样的情况&#xff1a;明明CSS代码写得一模一样&#xff0c;但是在不同的浏览器上呈现出的效果却大相径庭&#xff1f;这背后的原因&#xff0c;很大程度上要归结于所谓的“用户代理样式表”。 用户代理样式表&#xff…

TY1801 内置GaN电源芯片(18w-65w)

TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801内置 GaN 功率管,具备超宽 的 VCC 工作范围&#xff0c;非常适用于 PD 快充等要求宽输出电压的应用场合,TY1801不需要使用额外的绕组或外围降压电路&#xff0c;节省系统 BOM 成本。TY1801 支持 Burst&…

iPhone16销量不佳?海外机构给出否定答案,让国产手机失望了

在国内媒体都喜欢宣传iPhone16销量不佳&#xff0c;苹果又慌了等诸多对苹果不利的消息&#xff0c;不过日前海外分析机构却给出了不一样的答案&#xff0c;认为iPhone16的销量超过了去年的iPhone15&#xff0c;显然与国内媒体的宣传很不一样。 海外分析机构的数据是整理了iPhon…

【拥抱AIGC】应该如何衡量AI辅助编程带来的收益

本文主要介绍了如何度量研发效能&#xff0c;以及AI辅助编程是如何影响效能的&#xff0c;进而阐述如何衡量AI辅助编程带来的收益。 理解度量&#xff1a;有效区分度量指标 为了帮助研发团队更好地理解和度量研发效能&#xff0c;可以将指标分为三类&#xff1a;能力和行为指…

Python异常处理详解:try, except, else, finally的使用方法与示例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

PRAI-International Journal of Pattern Recognition and Artificial Intelligence

文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网&#xff1a;https://ais.cn/u/3eEJNv 三、服务简述 模式识别 • 机器学习 • 深度学习 • 文件分析 • 图像处理 • 信号处理 • 计算机视觉 • 生物识别技术 •…

Windows电脑本地安装AI文生音乐软件结合内网穿透远程访问制作

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 今天和大家分享一下在Windows系统电脑上本地快速部署一个文字生成音乐的AI创作服务MusicGPT&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问使用进行AI音…

上课了!老谭带你学习Ascend C,深入浅出,轻松掌握~

昇腾社区课程学习入口&#xff1a; Ascend C算子开发&#xff08;入门&#xff09;https://www.hiascend.com/developer/courses/detail/1691696509765107713Ascend C算子开发&#xff08;进阶&#xff09;https://www.hiascend.com/zh/developer/courses/detail/169641460679…

找出n个自然数(1,2,3,……,n)中取r个数的组合。

题目&#xff1a;找出n个自然数&#xff08;1,2,3&#xff0c;……&#xff0c;n&#xff09;中取r个数的组合。例如&#xff0c;当n5&#xff0c;r3时&#xff0c;所有的组合为&#xff1a; 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5 首先&#xff0c;找到…

【Golang】Go多线程中数据不一致问题解决方案--sync锁机制

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

AI工程师:AI时代的新岗位

从数量上看&#xff0c;AI工程师的数量可能比机器学习工程师/LLM工程师的数量要多得多。一个人可以非常成功地胜任这个角色&#xff0c;而无需接受任何培训。 —— Andrej Karpathy 仅初创公司的收入就超过 10 亿美元&#xff0c;随着 Gen AI 的早期成功迹象&#xff0c;每家有…

The current Windows user is not valid for executing Rabbitmq scripts

问题描述 在New Configuration或者Join host 配置的时候&#xff0c;执行配置信息报错如下 原因分析 可能的原因有如下两点 Cookie没有正确分配给当前用户这台机器是克隆来的&#xff0c;而且改了机器名 问题解决 要解决这个问题&#xff0c;需要卸载Erlang和RabbitMQ并重新安…

大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

中国数据库产业图谱(2024)

全图下载地址: 中国数据库产业图谱&#xff08;2024&#xff09;

雾霾下雨天气户外人像街景拍摄Lr后期调色,手机滤镜PS+Lightroom预设下载!

调色详情 在雾霾下雨天气下拍摄的户外人像街景往往具有一种独特的氛围。通过 Lightroom 进行后期调色&#xff0c;可以进一步强化这种氛围&#xff0c;使照片更加富有情感和艺术感。 预设信息 调色风格&#xff1a;灰调风格预设适合类型&#xff1a;人像&#xff0c;雾霾&am…

Xcode报错:Undefined symbols,Linker command failed with exit code1

这种编译报错点击Xcode左侧的小红叉这两行点击没反应&#xff0c;不知道具体报错原因怎么弄&#xff1f; 解决办法&#xff1a; 第一步&#xff1a;点周Xcode左侧工具栏的编译log日志按钮 第二步&#xff1a;第一步点击完Xcode左侧出现了编译历史列表&#xff0c;可以看到有报…

如何使用selenium结合最新版chrome爬虫

如何使用selenium结合最新版chrome爬虫 1、下载chrome及其插件chromedriver-win64 点我下载 [百度网盘] 通过百度网盘分享的文件:chrome爬虫插件 链接:https://pan.baidu.com/s/1kqkblX_ordZsQNYR234bMg 提取码:8888 下载后,解压安装。 2、配置电脑系统环境 我的电脑-…