HashMap第7讲——get方法源码分析

HashMap最后一篇啦,下篇就进入ConcurrentHashMap的学习和总结了。

一、简要步骤

HashMap的get方法也比较简单,下面是它的大致步骤:

  • 首先计算key的hash值,并通过hash值定位到在数据中的索引位置。

  • 如果该位置为空,说明没有对应的k-v键值对,直接返回null。

  • 如果不为空,遍历该位置上的元素,如果找到就返回Node节点,反之返回null。

二、源码注释

public V get(Object key) {Node<K,V> e;//hash(key):散列算法计算key的hash值//返回null说明没找到相关节点,反之找到,并返回key的value值return (e = getNode(hash(key), key)) == null ? null : e.value;
}
​
/*** Implements Map.get and related methods** @param hash hash for key* @param key the key* @return the node, or null if none*/
final Node<K,V> getNode(int hash, Object key) {//当前HashMap的散列表的引用Node<K,V>[] tab;//first:桶头元素  e:存放临时元素Node<K,V> first, e;//n:tab数组长度int n;//元素中的kK k;//1、将table赋值给tab,不等于null && (n = tab.length) > 0,说明有数据//(first = tab[(n - 1) & hash]) != null):将桶头元素赋值给first,不为null说明有数据if ((tab = table) != null && (n = tab.length) > 0 &&(first = tab[(n - 1) & hash]) != null) {
​if (first.hash == hash && // always check first node((k = first.key) == key || (key != null && key.equals(k)))){//2、定位到了桶位置的元素就是想要获取key,直接返回return first;}//到这说明桶头元素不是想要的if ((e = first.next) != null) {//到这说明该桶位置不止一个元素if (first instanceof TreeNode){//3、已经树化,调用红黑树的查找方法(getTreeNode(hash, key))return ((TreeNode<K,V>)first).getTreeNode(hash, key);}do {//链表if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k)))){//4、如果遍历到了就直接返回return e;}} while ((e = e.next) != null);}}//5、没有符合的就返回nullreturn null;
}

 End:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。

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

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

相关文章

【力扣 73】矩阵置零 C++题解 空间复杂度为O(1)的解决方案(向量+循环+矩阵)

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例 2&#xff1a; 输入&…

每个账号设置独立的cookie

如果需要为每个账号设置独立的Cookie&#xff0c;可以在Cookie中包含一个与用户账号相关的唯一标识符。这样&#xff0c;即使在同一台电脑上&#xff0c;不同的账号登录时也会设置不同的Cookie&#xff0c;从而区分不同的用户。以下是实现这一功能的示例代码&#xff1a; // 假…

AT32单片机踩坑记录

最近做个新项目打算使用AT32单片机&#xff08;AT32F403AVGT7&#xff09;&#xff0c;主要是和stm32极度相似&#xff0c;相关开发工具也逐渐完善&#xff0c;想着用个小项目练练手&#xff0c;当然踩坑也是必不可少的。 1.官方是带图形配置软件和IDE的&#xff0c;使用图形配…

开源项目有哪些机遇与挑战?

开源项目在软件开发领域具有许多机遇和挑战&#xff0c;让我们一起来看看&#xff1a; 机遇&#xff1a; 协作与共享&#xff1a; 开源项目鼓励开发者和组织之间的协作与共享&#xff0c;促进了知识和经验的传播。开发者可以通过参与开源项目来学习和提升技能&#xff0c;建立…

Databricks 收购 Tabular 的意义:数据开放框架的胜利

Databricks 宣布收购 Tabular&#xff0c;这是一个由 Apache Iceberg 的原始创建者开发的数据平台&#xff0c;在数据分析行业引发了涟漪。此次收购凸显了开放框架在数据领域日益增长的重要性&#xff0c;预示着数据管理、分析和 AI/ML 计划领域的创新、协作和可访问性的新时代…

数据库的学习(6)

题目&#xff1a; 数据准备创建两张表:部门(dept)和员工(emp)&#xff0c;并插入数据&#xff0c;代码如下create table dept(dept_id int primary key auto_increment comment 部门编号,dept_name char(20)comment部门名称 ); insert into dept (dept_name) values(销售部),(财…

音视频入门基础:H.264专题(11)——计算视频分辨率的公式

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的视频分辨率&#xff1a; 在vlc中也可以获取到视频分辨率&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 所以FFmpeg和vlc是怎样获取到H.264编码的视频的分辨率呢&#xff1f;它们其实是通过SPS中的属性…

深入理解Java并发、线程与等待通知机制

目录 一、基础概念 进程和线程 进程 线程 Java 线程的无处不在 进程间的通信 进程间通信有几种方式&#xff1f; CPU 核心数和线程数的关系 上下文切换&#xff08;Context switch&#xff09; 并行和并发 二、认识 Java 里的线程 Java 程序天生就是多线程的 线程…

华为机考真题 -- 密码解密

题目描述&#xff1a; 给定一段"密文"字符串 s, 其中字符都是经过"密码本"映射的&#xff0c;现需要将"密文"解密并且输出映射的规则 &#xff08;a - i)分别用(1 - 9)表示&#xff1b;(j - z)分别用(10* - 26*)表示约束&#xff1a;映射始终唯…

STM32学习和实践笔记(39):I2C EEPROM实验

1.I2C总线介绍 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。 它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I…

一套基于 Ant Design 和 Blazor 的开源企业级组件库

前言 今天大姚给大家分享一套基于Ant Design和Blazor的开源&#xff08;MIT License&#xff09;、免费的企业级组件库&#xff08;喜欢Ant Design风格的同学推荐使用&#xff09;&#xff1a;Ant Design Blazor。 项目特性 提炼自企业级中后台产品的交互语言和视觉风格。 开…

Java核心技术【二十二】Java的I/O流处理:深入文件读写操作、缓冲流、序列化与NIO

Java的I/O流处理&#xff1a;深入文件读写操作、缓冲流、序列化 在Java编程中&#xff0c;I/O流是处理输入输出操作的基础&#xff0c;特别是在文件读写、网络通信等领域。本文将在前文的基础上&#xff0c;进一步探讨缓冲流、序列化以及NIO&#xff08;New I/O&#xff09;在…

大数据开发者如何快速熟悉新公司业务

作为一名大数据开发工程师,进入一家新公司后快速熟悉业务是至关重要的。 目录 1. 了解产品形态故事1:电商平台的数据分析故事2:金融科技的风控系统故事3:社交媒体的推荐算法 2. 了解业务流程故事1:物流配送系统的优化故事2:医疗保险的理赔流程故事3:银行的贷款审批流程 3. 走…

通过 tomcat 让手机访问到电脑写的 html 网页

之前实现的 html 小项目只能在自己的电脑上展示&#xff0c;如果要在其他电脑或者在手机上就看不到网页了 想要在手机上访问自己写的网页&#xff0c;我们可以借助 tomcat 首先我们可以从官网下载 tomcat 官网链接&#xff1a;apache官网 我们拉到最底部&#xff0c;找到 a…

科普文:Java对象在堆中的内存结构

概叙 今天来讲些抽象的东西 -- 对象头&#xff0c;因为我在学习的过程中发现很多地方都关联到了对象头的知识点&#xff0c;例如JDK中的 synchronized锁优化 和 JVM 中对象年龄升级等等。 对象内存构成# Java 中通过 new 关键字创建一个类的实例对象&#xff0c;对象存于内存的…

7.10日学习打卡----初学Redis(五)

7.10日学习打卡 目录&#xff1a; 7.10日学习打卡一. redis功能流水线pipeline什么是流水线&#xff1f;pipeline实现使用pipeline 发布与订阅Redis的发布与订阅发布订阅命令行实现 慢查询Redis命令执行的整个过程如何进行配置实践建议 二 . redis的持久化机制RDB持久化机制触发…

Golang | Leetcode Golang题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; func calculate(s string) (ans int) {stack : []int{}preSign : num : 0for i, ch : range s {isDigit : 0 < ch && ch < 9if isDigit {num num*10 int(ch-0)}if !isDigit && ch ! || i len(s)-1 {switch preS…

洞察消费者心理:Transformer模型在消费者行为分析的创新应用

洞察消费者心理&#xff1a;Transformer模型在消费者行为分析的创新应用 在数字化时代&#xff0c;消费者行为分析对于企业理解市场动态、制定营销策略至关重要。Transformer模型&#xff0c;以其在处理序列数据方面的优势&#xff0c;为消费者行为分析提供了新的视角和工具。…

【大模型】解码LLM:GPT-3与LaMDA的架构比较与对比

解码LLM&#xff1a;GPT-3与LaMDA的架构比较与对比 引言一、GPT-3&#xff1a;解密大规模预训练的奥秘1.1 架构概览1.2 关键技术1.3 应用场景 二、LaMDA&#xff1a;对话智能的新篇章2.1 架构概览2.2 关键技术2.3 应用场景 三、比较与对比&#xff1a;GPT-3 vs. LaMDA3.1 架构设…

JavaSE学习笔记第二弹——对象和多态(下)

今天我们继续复习与JavaSE相关的知识&#xff0c;使用的编译器仍然是IDEA2022&#xff0c;大家伙使用eclipse或其他编译环境是一样的&#xff0c;都可以。 目录 数组 定义 一维数组 ​编辑 二维数组 多维数组 数组的遍历 for循环遍历 ​编辑 foreach遍历 封装、继承和…