HashMap的put方法源码分析

2025软考中级《数据库系统工程师》案例模拟题合集 1.【说明】某销售企业正在实施电商平台项目,主要功能模块包括用户中心、商品中心、交易中心、支付中心、营销中心等。其中支付中心模块包括了一个账户表:Account (ano, aname, balance),其中属性含义分别为:账户号,账户名称和账户余额。 假设现在存在事务Ti对账户表Account进行余额的修改,系统记录了修改账户表的日志记录,假设更新日志记录表示为 <Ti,A,V1,V2>,表明事务Ti对账户A执行了一个写操作,写操作前账户A的余额是V1,写操作后账户A的余额为V2。<Ti,D 阅读详情

通俗解析

###hashMap的put方法

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        // 如果数组为空或者长度为0,扩容,一般不会为0,除非new的时候特意初始化为0
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        // 如果当前key的hash在数组中尚不存在,就直接new一个node放进去
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            // 如果当前key的hash已经存在且key值也相同,则将value覆盖进去
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
		        // 如果hash存在但是key不同,且node已经是TreeNode(红黑树类型的节点),则加到树里
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
	            // 如果不是treeNode,则还是链表,要往后追加
                for (int binCount = 0; ; ++binCount) {
	                // 从链表头往下遍历
                    if ((e = p.next) == null) {
	                    // 如果已经到了链表尾,则将当前新node追加到尾部
                        p.next = newNode(hash, key, value, null);
                        // 如果追加完这个,链表长度会达到8个,则把链表改成用TreeNode(红黑树),并且结束遍历
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    // 如果遍历到了key相同的那个,就跳出来不往下遍历了
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    // 继续遍历下一个
                    p = e;
                }
            }
            // 前面只是取到要赋值的node,这里是真正把value赋值进来
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        // modeCount的作用是在使用迭代器遍历时保证数据不被修改:http://blog.youkuaiyun.com/u012926924/article/details/50452411
        ++modCount;
        // size增长触发扩容
        if (++size > threshold)
            resize();
        // 这是给LinkedHashMap用的
        afterNodeInsertion(evict);
        return null;
    }
Yolov5 多边形标签转换,所有json文件自动转成txt格式[详细过程] 注:labelme是麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发的图像标注工具,人们可以使用该工具创建定制化标注任务或执行图像标注,项目源代码已经开源。通过labelme对图进行标注后,得到的是json文件,而Yolov5对数据进行模型构建的时候,读取需要的是txt格式的文件。txt_outer_path——保存txt文本的文件夹的绝对路径。json_name——json_name是json文本的名字。json_floder——读取json的文件夹的绝对路径。 阅读详情

相关推荐

手把手教你用ECharts打造炫酷3D饼图(附完整源码)

本文详细介绍了如何使用ECharts创建炫酷的3D饼图,从环境配置到完整源码实现,涵盖参数解析、视觉优化和交互增强技巧。通过实战案例,帮助开发者快速掌握3D数据可视化技术,提升数据展示效果。

weixin_29031057的博客 279

解读HashMap中put方法的源码

由于重写了hashCode方法,致使strKey的hashCode和 strKey2的hashCode相同,但是他们equals的结果却不相同,这里使strKey和strKey2的hashCode相同的目的是为了制造散列冲突(散列冲突指的是 ”桶“ 已经被填充的现象,也就是元素对应的node数组下标的位置已经有值了),即由于hashCode相同导致不同的元素存放在node数组的同一位置,要注意hashCode即便是相同的也会出现散列冲突,这里只是为了模拟散列冲突所以设置了相同的hashCode。

qq_45593903的博客 1260

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

HashMap的put方法的源码分析(Java)

Java中HashMap的一点点源码的分析

m0_67683346的博客 1109

Zotero搭配CNKI.js插件:一键批量下载知网文献的完整教程(附常见问题解决)

本文提供Zotero搭配CNKI.js插件实现知网文献批量下载的完整教程。详细介绍了从环境准备、插件安装到实战操作的全流程,并针对常见问题提供解决方案,旨在帮助科研人员高效构建自动化文献管理工作流,显著提升文献收集与整理效率。

e4f5g6h7的博客 1199

别再死记硬背了!用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率

本文深度解析如何使用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率(GTFP)。通过详细的模型选择对比、数据准备策略和MaxDEA操作流程,帮助研究者科学构建指标体系并准确解读结果,提升环境管理研究的实证分析能力。

weixin_28731231的博客 314

HashMap源码之put方法

1.准备 讲put方法之前,先看两个方法,这两个方法可以根据一个key-value键值对的key确定其在entry数组中的下标位置 1.hash方法,计算key的hash值 static final int hash(Object key) { int h; // h = key.hashCode() 为第一步 取hashCode值 // h ^ (h >>> 16) 为第二步 高位参与运算, return (key == null) ? 0 : (h =

weixin_42044450的博客 927

FPGA远程升级必备:STARTUPE2原语控制Flash的避坑指南

本文深入解析了FPGA远程升级中STARTUPE2原语的核心价值与配置策略,详细介绍了其在QSPI Flash接口设计中的应用。通过Vivado工具和原语控制,开发者可以高效实现安全可靠的远程固件升级,提升系统稳定性和升级效率。

k8l9m0n的博客 395

HashMap中的put方法的源码解析

1.首先调用hash(key)计算hash值 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } 2.判断 传入的key是否等于null(在HashMap中是 允许存入null的) 对key值调用原生hashCode方法后进行 右移和异或运算得到 存放的数组的下标 static final int hash(Object key) { int h;

qq_42303467的博客 366

基于稀疏表示字典学习的图像超分辨率-杨建超论文解析

文章:《Image Super-Resolution via Sparse Representation》 作者:杨建超 信号稀疏的定义: 令字典D的原子个数M,信号维度为N,则有以下三种关系: M = N时,D为完备的; M > N时,D为冗余的; M>>N时, D为过完备的。 图解如下: 借鉴了压缩感知的思想,通过对大量低分辨率图像和高分辨...

ycc18829026593的博客 7637

【主题建模】一种基于深度学习的主题建模方法:BERTopic(实战篇)

BERTopic 是基于深度学习的一种主题建模方法。2018 年底,Devlin et al. 提出了 Bidirectional Encoder Representations from Transformers (BERT)。BERT 是一种用于 NLP 的预训练策略,它成功地利用了句子的深层语义信息。

Data · Model · Agent · Repeat 2万+

【Java集合】HashMap的put()源码详解以及JDK1.7与JDK1.8的区别

详细讲解HashMap添加操作底层源码,以及对比put()源码在JDK1.7和JDK1.8中的区别。

小七的博客 2834

用ChatGPT 5.5掌握SCI的4个实操润色技巧,论文质量极速提升!(附提示词)

ChatGPT 5.5的发布,在学术写作中的应用变得更加精准和安全,通过正确的使用方法,不仅可以改善语法与表达,让论文达到SCI发表水准,还能最大程度保留作者原意,将AIGC检测率控制在低风险区间。可以帮大家省下大量纠结语法、梳理逻辑的时间,在保证润色质量的同时,兼顾AIGC检测的合规要求,为论文投稿成功率提供实实在在的提升。通过智能调整语序、优化用词和句式结构,该方法能够在保留学术质感的同时,使文章表达更自然、贴近人工撰写的风格,从而避免文字过于程式化,提升论文整体可读性和表达的个性化特征。

智能AI让学术科研更容易 64

jdk13 HashMap中put方法源码分析

import java.util.HashMap.Node; import java.util.HashMap.TreeNode; /** * Associates the specified value with the specified key in this map. * If the map previously contained a mapping for the key...

jimiao_xxxx的博客 257

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HashMap的put方法的源码分析

当插入新的键值对时,HashMap会根据键的哈希值来确定其在哈希表中的位置。2. 获取哈希表中的桶位置:根据计算出的哈希值,我们可以通过位运算得到哈希表中的桶位置。3. 遍历链表,查找是否已存在相同的键:在哈希表中,每个桶位置可能包含一个链表,用于解决哈希冲突。4. 创建新的键值对并插入链表头部:如果在链表中没有找到相同的键,就需要创建一个新的键值对,并将其插入链表的头部。7. 返回null,表示插入成功:最后,如果插入的键不存在于哈希表中,put方法会返回null,表示插入成功。否则,返回null。

N201871643的博客 716

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

面试八股之集合篇7.3——面试题——HashMap常见属性及put方法的具体流程源码分析

🔥本篇概览:常见属性及put方法的具体流程源码分析。

做一个善良的人,做好自己的事,如果愿意,再发一份光。 961

HashMap源码分析之put方法

首先,看HashMap的属性: static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认初始容量,是2的倍数,1左移四位,就是1 0000 结果就是16 static final int MAXIMUM_CAPACITY = 1 << 30; //最大容量,2的30次幂,1 073 741 ...

m_ddNice的博客 158

HashMap put方法的源码分析

背景知识: java1.7 HashMap用的是数组+链表实现的,同时采用的头插入法,存在死循环的问题 java1.8 HashMap用的是数组+链表+红黑树实现的,采用尾插法实现的,解决了死循环的问题,今天分析的就是1.8 // 初始容量为16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // ...

凉快 553

HashMap中put方法(白话加源码分析)

一.首先不看代码用白话分析一下流程 我们在使用put方法的时候会传进key和value参数 在我们将这两个参数传入后, 第一步,我们的put方法会去判断这个hashmap是否为null 或者长度是否为0,如果是则对hashmap数组进行resize()扩容, 第二步,put方法会根据这个key计算hash码来得到数组的位置,(这里需要解释一下,我们的hashmap默认是由一个数组加链表组成的) 得到位置后当然是继续判断这个数组下标的值是否为null,为null 自然是直接插入我们的value值,如

IAMZTDSF的博客 9881

HashMap源码分析:put与get方法详解

1. 哈希计算:HashMap通过hash方法优化了key的哈希值分布2. 冲突解决:使用链表和红黑树解决哈希冲突3. 动态扩容:当元素数量超过阈值时自动扩容4. 树化优化:链表过长时转换为红黑树提高查询效率通过深入分析HashMap的put和get方法源码,我们不仅理解了其工作原理,也掌握了性能优化的关键点。HashMap的设计体现了空间换时间和分治思想,是Java集合框架中的经典实现。理解这些底层机制有助于我们在实际开发中更合理地使用HashMap,并能够针对特定场景进行优化。

weixin_73670121的博客 449

HashMap中get/put方法源码分析

HashMap 无序,存储与取出的顺序不相同;不可重复,存储的数据不能重复。 底层数据结构为哈希表,哈希表又称为散列表,是由数组和单向链表的组合形成的数据结构。JDK8之后,当链表长度达到8时,则会转化为红黑树。 存取原理: 1、put(k, v) 第一步:先将key,value封装到一个node节点中。 第二步:底层调用hashCode()计算hash的值,并通过哈希函数的算法将hash值转化为数组下标,如果下标位置上没有任何元素,就把Node添加到这里;如果下标位置上有链表,会用指定key与链表上的节点

weixin_44431550的博客 524

Jdk1.8 HashMap中put()方法源码分析

1.说明下环境,为jdk1.8,仅对put方法进行源码分析。 2.特别说明:我使用的是这个构造器: //15表示自定义map的初始容量为15 //0.7f表示自定义负载因子为0.7 HashMap<String, String> mapMine = new HashMap<String, String>(15,0.7f); 并不是下面的构造器: HashMap<String, String> mapMine = new HashMap<String, Strin

前路无畏的博客 1万+

源码分析HashMap中put方法的执行流程

- 调用put方法存放元素,首先先判断当前table数组是否为空,如果为空,则先去初始化这个数组; - 计算出当前存放元素的key的hashcode值,在根据这个hashcode值计算出准备存放到数组的哪个索引下; - 如果当前索引下没有元素,则直接将该元素放到这个索引下; - 如果当前索引存在元素,则进行比较索引下的元素和存入元素是否相同(通过key和hashcode比较);相同则覆盖,不相同则追加到链表或红黑树中。

sunao1106的博客 529

JDK8 HashMap put() 方法源码分析

红黑树是每个结点都带有颜色属性的二叉查找树,颜色或红色或黑色。结点是红色或黑色。根结点是黑色。所有叶子都是黑色。(叶子是NIL结点)每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。容量是2的幂次,当存的数达到 容量*0.75 时,扩容数组先存单向链表,链表上的节点个数超过8时,如果数组大小没有达到64,则扩容,否则链表转换成双向链表(仍然存在)再转换成红黑树。

一名小码农的博客 758

HashMap源码分析——put、get方法

相同系列 一、HashMap源码分析——默认参数问题 三、HashMap源码分析——扩容问题

weixin_43935467的博客 269

Java 8的HashMap的put方法源码分析

抱着加深学习印象和记录的想法,写下这篇博客。先上源码,如下图。 HashMap的put方法调用的是putVal方法,传入的 onlyIfAbsent 默认为false;evict为true。 /** * Associates the specified value with the specified key in this map. * If the map pre...

wq4zmi08的博客 293
上一篇: 自顶向下的性能优化与架构设计
下一篇: 5分钟真正理解mysql事务隔离级别和封锁协议
胡渣大叔
博客等级 码龄20年 11粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值