HashMap中的put()方法

一. HashMap底层结构

HashMap底层是由哈希表(数组),链表,红黑树构成,哈希表存储的类型是一个节点类型,哈希表默认长度为16,它不会每个位置都用,当哈希表中的元素个数大于等于负载因子(0.75)*哈希表长度就会扩容到原来的2倍

二. 底层的一些常量

三. HashMap的put()方法

当插入一个元素时,先利用hash(key)计算该元素的hash值 

 

这是计算哈希值的具体实现,如果该对象为空哈希值为0,否则调用这个对象重写的hashCode方法在和其向右无符号右移16位做异或运算,这样做的目的是减少hash冲突 

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {//tab是底层的哈希表,p是要遍历链表或红黑树的一个引用,n是哈希表长度Node<K,V>[] tab; Node<K,V> p; int n, i;//如果哈希表为空或哈希表的长度位0,则调用resize()方法初始化哈希表,并将长度赋给nif ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;//用(n-1)&hash来定位该元素要存放在哈希表中的哪个位置//如果该位置为空,则表示之前没有存放过元素,不存在元素重复的情况,直接放入该位置即可if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);//否则,该位置不为空,表示之前存放有元素else {//e是用来标记重复元素的Node<K,V> e; K k;//这里是判断是否是重复元素,只判断第一个位置是否是重复元素//p表示哈希表中的元素//如果两者的hash值相同且两个元素的地址相同,那么肯定是重复元素//如果两者的hash值相同,地址不同,但equals()比较的内容相同,则是重复元素if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))//记录重复元素e = p;//否则如果第一个元素不是重复元素,且p的类型是红黑树结构,则调用红黑树的put方法进行插入else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);//否则第一个元素不是重复元素且hash表中是链表结构//一次遍历链表后面的元素,看是否还有重复元素,有就标记,到尾部没有就插入else {for (int binCount = 0; ; ++binCount) {//判断p的下一个是不是空,并将p的下一个赋值给eif ((e = p.next) == null) {//找到链表尾部进行插入p.next = newNode(hash, key, value, null);//binCount用来记录链表中的元素个数,插入后判断链表个数//如果大于等于7(这里从0开始,其实实际个数超过8),则链表转为红黑树if (binCount >= TREEIFY_THRESHOLD - 1)treeifyBin(tab, hash);break;}//如果当前要比较的元素(e)不是尾部元素,则判断是否是重复元素if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;//e是重复元素就跳出循环p = e;//不是重复元素就将e赋值给p,相当于继续往下走去判断后面的元素}}//e不为空代表有重复元素if (e != null) { // existing mapping for keyV oldValue = e.value;//用重复元素后面出现的值替换原本的值if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;if (++size > threshold)resize();//如果哈希表中的元素大于负载因子(0.75)*哈希表长度,则哈希表进行扩容afterNodeInsertion(evict);return null;}

 

当哈希表中某个位置的链表个数大于8,则调用treeifyBin但此时不一定树化,还有一个条件,当哈希表的长度大于MIN_TREEIFY_CAPACITY(64)时才树化,否则只是调用resize()进行扩容

四. 底层哈希表的扩容

1.当向哈希表为null或哈希表的长度为0,即哈希表还没有初始化时会扩容为默认长度16

2.当哈希表中的位置被用了负载因子(0.75)*哈希表的长度时会扩容为原来的2倍

3.当哈希表中某个链表的个数达到8,但哈希表的长度未到64会扩容为原来的2倍

 

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

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

相关文章

ONLYOFFICE最新8.1版本——桌面编辑器简单测评

前言 大家好&#xff0c;我是小雨&#xff0c;看到最近ONLYOFFICE更新了最新的版本&#xff0c;更新了一下当前版本来具体的测评一下&#xff0c;先来看看官网提供的各类更新信息&#xff0c;下面是我找到的三个主页&#xff0c;包括功能演示链接&#xff0c;官网连接以及专门…

阿里云存储

传统存储面临的挑战 现如今&#xff0c;数据与土地、劳动力、资本、技术并称为五大生产要素&#xff0c;数据成为数字经济发展的重要引擎。大数据时代&#xff0c;数据处理的需求急剧增长&#xff0c;越来越多的智能设备以及新应用如区块链、机器学习训练和AI等产生大量的数据…

复分析——第10章——Θ函数应用(E.M. Stein R. Shakarchi)

第10章 Θ函数的应用 (Applications of Theta Functions) The problem of the representation of an integer n as the sum of a given number k of integral squares is one of the most celebrated in the theory of numbers. Its history may be traced back to Diopha…

CV03_mAP计算以及COCO评价标准

COCO数据集回顾&#xff1a;CV02_超强数据集&#xff1a;MSCOCO数据集的简单介绍-CSDN博客 1.1 简介 在目标检测领域中&#xff0c;mAP&#xff08;mean Average Precision&#xff0c;平均精度均值&#xff09;是一个广泛使用的性能评估指标&#xff0c;用于衡量目标检测模型…

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限&#xff0c;使我们拥有调用 aliyunAPI 的权限&#xff0c;之后会生成 AccessKeyID 和 AccessKey密码&#xff0c;后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来&#xff0c;否则后期无法查…

奇迹MU 骷髅战士在哪

BOSS分布图介绍 我为大家带来各地区怪物分布图。在游戏前期&#xff0c;很多玩家可能会不知道该去哪里寻找怪物&#xff0c;也不知道哪些怪物值得打。如果选择了太强的怪物&#xff0c;弱小的玩家可能会无法抵御攻击。如果选择了低等级的boss&#xff0c;收益可能并不理想。所…

智能家居安防系统教学解决方案

前言 随着科技的不断进步和智能家居概念的深入人心&#xff0c;智能家居安防系统作为智能家居领域的重要组成部分&#xff0c;其重要性日益凸显。智能家居安防系统不仅能够提供环境和人员的监测功能&#xff0c;还能够采取措施降低或避免人员伤亡及财产损失。因此&#xff0c;…

Double 4 VR虚拟情景智能互动系统在高铁乘务管理课堂上的应用

在不断进步的科技背景下&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已广泛应用于教育领域。VR技术的运用为课堂教育提供了新的思路与方式&#xff0c;尤其在高铁乘务管理这一专业中&#xff0c;Double 4 VR虚拟情景智能互动系统更是发挥了其独特的优势。 一、VR技术带…

word文档没有保存就关闭了怎么恢复?找到正确的方法

昨天写教程的时候&#xff0c;终于完成了一个word文档&#xff0c;以为保存了就直接关了。word提醒我“是否保存”&#xff0c;我直接忽略了。动作一气呵成&#xff0c;毫不犹豫的关闭了。之后才发现我没有保存word文档。这种情况大家有遇到过吗?我们该如何在没有保存的情况下…

迎接AI新时代:GPT-5即将登场的巨大变革与应用前瞻

迎接AI新时代&#xff1a;GPT-5即将登场的巨大变革与应用前瞻 &#x1f48e;1. GPT-5 一年半后发布&#xff1a;AI新时代的来临1.1 GPT-5的飞跃&#xff1a;从高中生到博士生 &#x1f48e;2. GPT-5的潜在应用场景&#x1f48e;2.1 医疗诊断和健康管理&#x1f48e;2.2 教育领域…

Docker+Spring boot为环境变量赋值(普通变量和List变量)

DockerSpring boot为环境变量赋值&#xff08;普通变量和List变量&#xff09; Spring boot开发微服务&#xff0c;使用yml做配置文件&#xff0c;Docker方式部署。 在不同环境中&#xff0c;需要对yml中的配置进行调整&#xff0c;本文主要介绍在以docker run方式运行时&…

谷歌推广:精准定位潜在客户群体,提高广告转化率

借助谷歌推广&#xff0c;你的品牌将如火箭升空般迅速崛起。作为全球最大的搜索引擎&#xff0c;其影响力犹如站在巨人之肩&#xff0c;触及的受众规模高达数十亿人。更为重要的是&#xff0c;我们可以准确锁定那些最有可能对贵公司的产品或服务产生浓厚兴趣的群体。这并非普通…

【Git】取消追踪多个文件或目录

文章目录 场景方法1. 添加到 .gitignore2. 从暂存区移除 示例1. 编辑 .gitignore 文件2. 从暂存区移除文件或目录 场景 清理&#xff1a;不再希望某些文件被 Git 追踪。配置忽略文件&#xff1a;通常配合 .gitignore 文件使用&#xff0c;以便以后这些文件不会被重新添加到索引…

ContextCapture - 开启三维世界的魔法之门

亲爱的朋友们&#xff0c;当我第一次接触到ContextCapture这款软件时&#xff0c;我的内心激动得难以平静。仿佛一位魔法师突然出现在我面前&#xff0c;向我展示了一个全新的世界。是的&#xff0c;这就是ContextCapture带给我的感觉 - 它不仅仅是一款软件&#xff0c;更是一把…

基于海思Hi3403V100方案开发双目1600万拼接相机测试截图

海思Hi3403V100平台SOC内置四核A55&#xff0c;提供高效且丰富和灵活的CPU资源&#xff0c;以满足客户计算和控制需求&#xff0c;并且集成单核MCU&#xff0c;已满足一些低延时要求较高场景。 多目相机PE108CB板是针对该芯片设计的一款多目凭借相机PCBA&#xff0c;硬件接口支…

7寸微型FPV无人机技术详解

对于7寸微型FPV&#xff08;First Person View&#xff0c;第一人称视角&#xff09;无人机技术的详解&#xff0c;可以从以下几个方面进行介绍&#xff1a; 一、定义与基本概念 FPV无人机&#xff0c;全称为“第一人称视角无人机”&#xff0c;它利用安装在无人机上的摄像头…

键盘异常的检测与解决方案

今天对象用Word写文档&#xff0c;按下Ctrl的时候&#xff0c;页面不停地上下滑动&#xff0c;导致无法正常编辑文本。 重启之后&#xff0c;仍然无法解决&#xff0c;推断是键盘坏了。 但是当按下Fn或其他功能键&#xff0c;焦点移除&#xff0c;页面就不会再抖动了。 现在…

JVM的基础介绍(1)

本文是“深入学习JVM”系列的第一篇文章&#xff0c;主要介绍JVM、JVM的3大子系统各自的功能。 我是蚊子码农&#xff0c;欢迎各位的点赞、关注和收藏&#xff0c;有了你们的激励&#xff0c;我会带来更好的作品。 一、JVM的介绍 JVM&#xff0c;即Java Virtual Machine&…

3C电子制造行业MES系统,提高企业生产效率

随着科技的不断进步&#xff0c;3C电子制造行业正迎来传统工厂向数字化工厂转型的阶段。在这场变革中&#xff0c;MES系统发挥着重要的作用&#xff0c;成为了企业变革的“智慧大脑”&#xff0c;引领着生产流程的优化和升级。 那么&#xff0c;MES系统究竟有哪些功能&#xf…

Coze:如何开发你的第一个聊天机器人?

你好&#xff0c;我是三桥君。 我们要学习如何创建第一个聊天机器人&#xff1f;让AI工具成为我们的得力助手&#xff0c;帮助我们的工作。 如何创建Bot&#xff1f; 首先&#xff0c;点击首页里面的“创建Bot”按钮。 ​ “工作空间”我们选择个人空间。接下来是“Bot名称”…