当前位置: 首页 > news >正文

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:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python,利用可变对象实现设置参数的自动回存
  • Knife4j的原理及应用详解(七)
  • 探索大模型:袋鼠云在 Text To SQL 上的实践与优化
  • 技校专业群的生成机制研究
  • linux系统“/“目录比“/home“目录小
  • 多图详解入门级AI绘画 Midjourney工具注册使用流程,AI绘画必备工具
  • MySQL篇:日志
  • ubuntu计划任务反弹
  • php获取,昨,今,后天.... 本周,月,年...日期时间戳
  • 1.浅谈蓝牙BLE的总体框架
  • 【Mark笔记】基于Centos7.7更改SSH端口重启服务报错
  • SAP S4 销售组的定义和分配
  • WGS84坐标转换代码(JS版)
  • KVM虚拟机添加USB转串口设备
  • Github获8k Star!入选苹果CoreML模型库的Depth Anything是怎么做出来的?
  • [Vue CLI 3] 配置解析之 css.extract
  • android图片蒙层
  • CentOS7简单部署NFS
  • co模块的前端实现
  • emacs初体验
  • git 常用命令
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • react-native 安卓真机环境搭建
  • SpingCloudBus整合RabbitMQ
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 关于 Cirru Editor 存储格式
  • 汉诺塔算法
  • 删除表内多余的重复数据
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • ​Spring Boot 分片上传文件
  • #数据结构 笔记三
  • (9)STL算法之逆转旋转
  • (动态规划)5. 最长回文子串 java解决
  • (二)斐波那契Fabonacci函数
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (篇九)MySQL常用内置函数
  • (三)Honghu Cloud云架构一定时调度平台
  • (三)mysql_MYSQL(三)
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (原创)可支持最大高度的NestedScrollView
  • (转)Linq学习笔记
  • (转)详解PHP处理密码的几种方式
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .bat批处理(一):@echo off
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET 反射的使用
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • ::什么意思
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)