HashMap的containsKey方法底层详解

深入理解 Java 中HashMap的 containsKey 和containsValue 方法 阅读详情

containsKey方法简介

  • 用 containsKey(key) 方法来检查 key 是否存在,

源码分析

  • /**
    * 检查是否包含key
    * 如果key有对应的节点对象,则返回ture,不关心节点对象的值是否为空
    */
    public boolean containsKey(Object key) {
        // 调用getNode方法来获取键值对,如果没有找到返回false,找到了就返回ture
        return getNode(hash(key), key) != null; //真正的查找过程都是通过getNode方法实现的
    }
     
    /**
    * 该方法是Map.get方法的具体实现
    * 接收两个参数
    * @param hash key的hash值,根据hash值在节点数组中寻址,该hash值是通过hash(key)得到的,可参见:hash方法解析
    * @param key key对象,当存在hash碰撞时,要逐个比对是否相等
    * @return 查找到则返回键值对节点对象,否则返回null
    */
    final Node<K,V> getNode(int hash, Object key) {
        Node<K,V>[] tab; Node<K,V> first, e; int n; K k; // 声明节点数组对象、链表的第一个节点对象、循环遍历时的当前节点对象、数组长度、节点的键对象
        // 节点数组赋值、数组长度赋值、通过位运算得到求模结果确定链表的首节点
        if ((tab = table) != null && (n = tab.length) > 0 &&
            (first = tab[(n - 1) & hash]) != null) {
            if (first.hash == hash && // 首先比对首节点,如果首节点的hash值和key的hash值相同 并且 首节点的键对象和key相同(地址相同或equals相等),则返回该节点
                ((k = first.key) == key || (key != null && key.equals(k))))
                return first; // 返回首节点
     
            // 如果首节点比对不相同、那么看看是否存在下一个节点,如果存在的话,可以继续比对,如果不存在就意味着key没有匹配的键值对    
            if ((e = first.next) != null) {
                // 如果存在下一个节点 e,那么先看看这个首节点是否是个树节点
                if (first instanceof TreeNode)
                    // 如果是首节点是树节点,那么遍历树来查找
                    return ((TreeNode<K,V>)first).getTreeNode(hash, key); 
     
                // 如果首节点不是树节点,就说明还是个普通的链表,那么逐个遍历比对即可    
                do {
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k)))) // 比对时还是先看hash值是否相同、再看地址或equals
                        return e; // 如果当前节点e的键对象和key相同,那么返回e
                } while ((e = e.next) != null); // 看看是否还有下一个节点,如果有,继续下一轮比对,否则跳出循环
            }
        }
        return null; // 在比对完了应该比对的树节点 或者全部的链表节点 都没能匹配到key,那么就返回null
    }

    总结:HashMap的containsKey方法,内部实际还是根据key去找对应节点,和get方法类似

hashMap.containsKey(value)时间复杂度分析 1. 分析hashMap.containsKey hashMap.containsKey(value)的时间复杂度为什么是O(1)呢?这个就要来看一下源码了 /** * Returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if this map contains a mapping for the * specified key. * ... 阅读详情

相关推荐

HashMap的containskey源码分析

HashMap作为util包中比较常用的一个数据结构,充分理解内部代码的逻辑是有很必要的,这里做一个对HashMap 的containsKey函数的源码分析笔记。containsKey的代码如下: /** * Returns <tt>true</tt> if this map contains a mapping for the * specified key. *

LiuConey的博客 3507

Java中containsKey()方法

containsKey方法——判断是否包含指定的键名 在HashMap中经常用到containsKey()来判断键(key)是否存在。 HashMap中允许值对象(value)为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况:一种是在HashMap中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在HashMap中不应该利用get()方法来判断是否存在某个键,而应该利用containsKey()方法来判断。 例如: HashMap&l

柠檬鱼的博客 2万+

Java HashMap 中 containsKey 与 containsValue 方法的性能优化实践

本文深入探讨了Java HashMap中containsKey与containsValue方法的性能差异及优化实践。通过分析HashMap底层实现原理,揭示containsKey的O(1)时间复杂度优势与containsValue的O(n)性能陷阱,并提供数据结构重构、Guava BiMap使用等实用优化方案,帮助开发者提升大数据量下的查询效率。

weixin_29213827的博客 354

JDK8:HashMap源码解析:get方法、containsKey方法、getNode方法

一、概述 HashMap存储的键值对,用put(K,V)方法来存储,用get(K)方法来获取V,用containsKey(K)方法来检查K是否存在。可先参见:put方法解析 来了解键值对的存储原理,再来看get方法就很容易了。 二、方法解析 /** * 获取key对应的值,如果找不到则返回null * 但是如果返回null并不意味着就没有找到,也可能key对应的值就是null,因为Hash...

老艮头的后知后觉 4607

Java中Map接口containsKey方法详解与实战

Java集合框架中的Map接口提供了方法,用于判断指定的键是否存在于当前的Map对象中。其方法原型如下:参数说明key:要检查是否存在的键对象。该参数可以为null,具体是否允许null键取决于具体的Map实现类(如HashMap允许null键,而TreeMap不允许null键)。该方法的作用是通过比较传入的键对象与Map中已有的键对象是否相等,来判断目标键是否存在。其内部机制依赖于键对象的equals()方法和hashCode()

weixin_31315007的博客 1226

华为ENSP完整安装教程

华为ENSP完整安装教程

Hnm456756的博客 7321

Java集合与Map核心方法详解:从底层原理到牛客刷题实战

Java集合框架是开发与笔试中的核心基础,List、Set、Map三大体系各自承载不同的数据组织需求。理解ArrayList的动态数组、LinkedList的双向链表以及HashSet的哈希去重机制,能帮助开发者快速选型。而HashMap作为Map接口的典型实现,其数组+链表+红黑树的底层结构决定了put、get、遍历等方法的效率与返回规则。掌握集合的遍历方式、去重逻辑和复杂度意识,不仅能避免OJ刷题中的常见坑点,也能在实际工程中提升数据处理能力。本文从集合接口的继承关系出发,拆解高频方法的返回值与适用场景

weixin_31292729的博客 313

STK中的传感器、雷达、发射机、接收机、天线

本文根据STK手册介绍了传感器、雷达、发射机、接收机、天线等对象的基本属性,简略分析了它们的不同之处。

wangyulj的专栏 1万+

Java 哈希表 HashMap 语法详解:从入门到刷题实战

不同的 key,经过 hash 计算后,可能会得到相同的位置。key1 -> 3号位置key2 -> 3号位置这就叫哈希冲突。HashMap 会想办法解决冲突。数组 + 链表 + 红黑树当同一个位置上的元素较少时,使用链表。当同一个位置上的元素过多时,可能会转换成红黑树,提高查询效率。哈希表不是绝对不会冲突,而是有一套机制处理冲突。// 创建 HashMap// 添加键值对// 获取 valuemap.get(1);// 判断 key 是否存在// 不存在时返回默认值。

dashuaigeshiboya的博客 232

Emscripten安装(wasm编译)

5:配置对应环境变量--替换成自己对应的安装路径(2025最新的Emscripten工具链默认使用LLVM/WebAssembly标准工作流,java依赖已经移除了,所以以下java环境不配,需要使用java的手动添加即可---->emsdk install java-8-152-64bit。3:下载相应的依赖库---->emsdk install latest(我这里下的是最新的,如果有指定版本,把latest替换成版本号即可)6:测试是否成功---> emcc- v/em++ -v。

qq_31578301的博客 554

手把手教你搞定JBI投稿:从Statement of Significance到Declaration Statement的保姆级避坑指南

本文提供了一份详细的JBI投稿指南,重点解析Statement of Significance和Declaration of Interests的撰写技巧,帮助研究者避开常见格式陷阱。通过实战案例和检查清单,确保投稿符合JBI的学术严谨性和临床转化价值要求,提升稿件通过率。

weixin_29278805的博客 614

HashMap之containsKey

HashMap之containsKey 前提: jdk1.8之前HashMap的存储方式:链表+hash jdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法 业务逻辑整理 1,map不能为空,且hash对应的下标要存在。否则返回null 2,取下标对应的对象,如果该对象的key与入参key一致,则返回该对象 3,否则,获取下一个对象,如果该对象为空,返回null 4,如果当前对象是树结构,则调用getTreeNode,获取是否存在 5,如果不是树结构,循环对象,如果存在对象的key

Frank-Fu 2811

RAG-Anything 实战:构建企业级多模态知识图谱问答系统

本文详细介绍了如何利用RAG-Anything构建企业级多模态知识图谱问答系统,解决跨模态文档处理的痛点。通过架构设计解析、部署实战指南和典型业务场景解决方案,帮助企业实现高效的知识管理和智能检索,提升决策效率。

weixin_29089057的博客 385

containsKey方法

containsKey方法——判断是否包含指定的键名 链接:https://www.jianshu.com/p/917595b3979d Map可以出现在k与v的映射中,v为null的情况 Map集合允许值对象为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在Ma...

weixin_43369038的博客 2万+

simulink构建一个基于 BP(反向传播)神经网络 的自适应 PID 控制系统

本文介绍了基于BP神经网络的自适应PID控制系统设计方法。系统通过神经网络实时调整PID参数,实现智能控制。主要内容包括:1)系统架构设计,采用误差反馈和在线学习机制;2)详细建模步骤,从被控对象定义到神经网络结构设计;3)S-Function实现核心算法,包含前向传播、PID计算和反向传播;4)仿真结果分析,显示神经网络PID在响应速度、超调控制和鲁棒性方面的优势;5)进阶建议和常见问题解决方案。该方法突破了传统PID的局限性,实现了具有自我学习能力的智能控制。

xiaoheshang_123的博客 51

【WRF-Chem 工具】CAMStoWRF详解:CAMS数据下载及处理

【WRF-Chem 工具】CAMStoWRF详解:CAMS数据下载及处理

WW、forever的博客 195

hashmap示例_Java HashMap containsKey()方法与示例

hashmap示例 HashMap类containsKey()方法 (HashMap Class containsKey() method) containsKey() method is available in java.util package. containsKey()方法在java.util包中可用。 containsKey() method is used to check whet...

1254

【树莓派安装Homeassistant及基本配置】

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!

vor234的博客 1万+

Java HashMap containsKey() 方法

containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。containsKey() 方法的语法为:hashmap.containsKey(Object key)hashmap 是 HashMap 类的一个对象。

m0_63364103的博客 1233

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ConcurrentHashMap和HashMap的containsKey方法区别

ConcurrentHashMap不能以null作为key,key为null时将返回NullPointerException;HashMap可用null作为key,key为null时,返回hash值为0指向位置的值。

xktxoo的博客 9174

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

map的containsKey方法

map是一个key和value的键值对集合。 map中的containKey(key)方法是判断该key在map中是否有key存在。如果存在则返回true,反之,返回false。 程序实例: 判断数组中是否有1,有的话就返回1和1所在的位置。 我采用的是hashmap,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1),时间消耗是很少的。 package TT04; import java.util.Has...

qq_43238335的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

源码分析——HashMap的put,resize,containskey方法原理分析

HashMap的put方法 /** * Associates the specified value with the specified key in this map. * If the map previously contained a mapping for the key, the old * value is replaced. * ...

随手记 1754

HashMap的containsKey方法说明

/** * Returns the entry associated with the specified key in the * HashMap. Returns null if the HashMap contains no mapping * for the key. */ final Entry getEntry(Object key)

执米之手,与米偕老 1万+

Java中containsKey 、 contains 方法详解

containsKey 和 contains 是两个常用的方法,分别用于检查集合中是否包含指定的键或元素。

技术分享 2193

HashMap源码-containsKey方法

环境:jdk1.8containsKey方法源码如下://传入参数:key值 public boolean containsKey(Object key) { //调用核心方法getNode,判断是否存在对应节点 return getNode(hash(key), key) != null; }getNode方法源码如下://传入参数:1.根据key散列计算得到的哈希值 2.key值 fin...

ignorewho的博客 2916

面试手写HashMap,手撕HashMap

前言: 现在面试时,面试官经常会问到HashMap,简单点就会问下HashMap的一些关键知识点,困难些的可能会当场让你手写一个HashMap,考察下你对HashMap底层原理的了解深度;所以,今天特别手写了一个简单的HashMap,只实现了 put、get、containsKey、keySet 方法的 HashMap,来帮助我们理解HashMap的底层设计原理。 本文...

木子雷的博客 2220
上一篇: 求的ArrayList的初始容量大小
下一篇: 删除数据库的外键
Future_LL
博客等级 码龄9年 215粉丝 255原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值