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. 8分钟学会Consul集群搭建及微服务概念
  2. 调试windows服务
  3. python的setting怎么找_django项目的配置文件settings.py详解
  4. idea mysql错误提示_idea提示错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  5. SpringBoot面试题第一弹
  6. 19.Qt中Thread线程中创建QTcpSocket
  7. java image getscaledinstance_使用getImage()和getScaledInstance()调整java.awt.Image的异常大小...
  8. android post数据到php服务器,通过post方法将数据上传到服务器Android Studio
  9. 谷粒商城:07. pms_catelog.sql
  10. 设计模式(四)行为型之模板方法模式、策略模式、命令模式、责任链模式
  11. Win11 安装 Linux 子系统
  12. msi z170 网卡 linux,麻雀虽小五脏俱全:msi 微星 发布 Z170I Gaming Pro AC Mini-ITX主板...
  13. java毕业设计数码产品导购网站mybatis+源码+调试部署+系统+数据库+lw
  14. 基于API的ArrayList集合之学习记录
  15. java字符转转长整型_P104 将数字字符串转换成长整型整数 ★★
  16. 1004: 惠民工程 (2013年中南大学研究生复试机试 )
  17. 什么是 jQuery?
  18. hdu 3374 String Proble
  19. 操作系统期末考试试卷
  20. 女学霸考692分想当“程序媛”,女生到底要不要学计算机?

热门文章

  1. 说说ShellExecuteEx
  2. DOM - DOM事件高级
  3. storm详解与调优
  4. 2019-2020 ICPC香港 A. Axis of Symmetry (思维+结论)
  5. 显示器花屏 还会出现重启
  6. HTML5 游戏开发实战 | 推箱子
  7. java 自定义xsd_spring自定义标签之 规范定义XSD
  8. 封面新闻的笔试小项目
  9. MSSQL·将一对多的数据合并为以指定分隔符的数据
  10. 润和软件:公司深度参与了华为海思系列芯片研发