containsKey方法简介

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

源码分析

  • /**
    * 检查是否包含key
    * 如果key有对应的节点对象,则返回ture,不关心节点对象的值是否为空
    */
    public boolean containsKey(Object key) {// 调用getNode方法来获取键值对,如果没有找到返回false,找到了就返回turereturn 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值是否相同、再看地址或equalsreturn e; // 如果当前节点e的键对象和key相同,那么返回e} while ((e = e.next) != null); // 看看是否还有下一个节点,如果有,继续下一轮比对,否则跳出循环}}return null; // 在比对完了应该比对的树节点 或者全部的链表节点 都没能匹配到key,那么就返回null
    }

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

HashMap的containsKey方法底层详解相关推荐

  1. 对StringBuilder的append方法底层详解

    首先查看builder对象的初始化 StringBuilder builder = new StringBuilder(); 在该方法内指向了超类的构造方法,并传入了一个int值,它的形参名为:容积( ...

  2. Redis五种基本数据类型底层详解(原理篇)

    Redis五种基本数据类型底层详解 详细介绍Redis用到的数据结构 简单动态字符串 SDS和C字符串的区别 总结 链表 字典 哈希表 字典 哈希算法 解决键冲突 rehash(重点) 渐进式reha ...

  3. golang导入git包_使用go module导入本地包的方法教程详解

    go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具.到今天 Go1.14 版本推出之后 Go mod ...

  4. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

  5. python怎么画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

  6. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

  7. batchnorm2d参数 torch_pytorch方法测试详解——归一化(BatchNorm2d)

    测试代码: import torch import torch.nn as nn m = nn.BatchNorm2d(2,affine=True) #权重w和偏重将被使用 input = torch ...

  8. android+发邮件,Android发送邮件的方法实例详解

    Android发送邮件的方法实例详解 时间:2021-05-20 本文实例讲述了Android发送邮件的方法.分享给大家供大家参考,具体如下: 在android手机中实现发送邮件的功能也是不可缺少的. ...

  9. java servlet init方法_JSP开发Servlet重写init()方法实例详解

    jsp开发servlet重写init()方法实例详解 写一个servlet时,有时需要我们重写该servlet的初始化方法,然后,究竟是重写init(servletconfig config),还是重 ...

最新文章

  1. mysql常见死锁_MySQL死锁系列-常见加锁场景分析
  2. centos7下的glusterfs的安装与使用
  3. [网络流24题]最小路径覆盖问题
  4. 深度学习100例-生成对抗网络(DCGAN)手写数字生成 | 第19天
  5. 五种方法实现python3-随机生成10位包含数字和字母的密码
  6. 求一份100行左右的C语言程序,求4个C语言程序 每个100行左右 大一水平的
  7. netty发送数据_看完这篇还不清楚Netty的内存管理,那我就哭了
  8. 锐起无盘辅服务器的作用,锐起无盘特殊功用为网吧带来更多收益
  9. C语言百叶窗动画效果算法,用vb实现“百叶窗”的图形特效_visualbasic教程
  10. node 压缩图片_设计神器!图片在线工具–Online Image Tool
  11. led闪烁和流水灯代码
  12. LiveGBS国标GB/T28181流媒体平台华为IPC设备GB35114配置接入说明
  13. 海洋磁力探测-G882海洋磁力仪内业处理软件MAP2000 操作指南
  14. 二元隐函数求二阶偏导_隐函数求二阶偏导
  15. html点击冒泡事件,JavaScript 浏览器事件机制(捕获、冒泡、委托)
  16. 为什么使用对象指针而不是使用对象本身?
  17. Windows 2012 NIC teaming多网卡高可用Powershell版
  18. C/C++外卖点餐管理程序
  19. SequoiaDB巨杉数据库成为唯一入选 “硅谷2016 大数据地形图”中国厂商, 企业级市场超越MongoDB等海外产品
  20. sibelius西贝柳斯2023中文版是什么打谱软件?如何下载

热门文章

  1. C语言编程中关于头文件使用问题
  2. 安卓 Spinner的用法
  3. 从“思想世界”到“历史世界”——余英时《朱熹的历史世界》述评 / 陈来[ZZ]...
  4. 计算机系统导论+2018,2018年计算机科学导论(董荣胜)4.ppt
  5. Havok 解决方案
  6. TreeSet类的学习
  7. solrJ6.5.1 使用
  8. 浅谈ECMAScript 6下的promises API
  9. unet++代码实现
  10. 高效学习法--之SQ4R学习法和相关思维导图