浅谈java中HashMap键的比较方式

 更新时间:2021年05月23日 16:22:31   作者:东风吹雨  
今天带大家了解一下java中HashMap键的比较方式,文中有非常详细的解释说明及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下

先看一个例子

 Integer integer=12344;
  Integer integer1=12344;

在Java中Integer 和Integer1是不相等的,但是如果再执行如下语句

map.put(integer, 1);
 map.put(integer1, 2);

会发现2会把1覆盖,问题来了,明明是两个不同的对象,为什么,2会把1覆盖呢?
我们看HashMap中添加键的源代码,如下

在这里插入图片描述

可以发现我们传进来的键交给了一个hash的成员方法区处理,这里我们看看hash方法的源码

在这里插入图片描述

哦,看到这里明白了,我们传进来的键会执行hashCode方法,那么到这里我们明白了,原来,HashMap判断两个键是否相等是看他们的hashCode
是否相等,
那我们看看上面说的integer和integer1的hashCode是否相等

在这里插入图片描述

这里发现是相等的,都是12344,所以我们可以很轻易的得出结论integer和integer1代表的是同一个键~,(这个结论是错的,继续往下看)
到这里还有一个问题,hashCode相等的两个对象他们的键一定是相同的吗?
先说答案不是,为什么呢?
来,我再举一个例子,先定义两个字符串name,name1

在这里插入图片描述

然后输出他们的hashCode值

在这里插入图片描述

可以看出,这两个不同的字符串拥有相同的hashCode值,
那么我们执行如下代码

在这里插入图片描述

看看他的输出结果

在这里插入图片描述

嗯?怎么会这样?我们定义的两个字符串明明hashCode值相同,按理来说,他们在HashMap中应该是同一个键才对,为什么会是两个不同的键?
我们再回过头看HashMap中的put方法

在这里插入图片描述

发现他调用了一个叫putVal得方法我们点进去看看

在这里插入图片描述

看到这里我们明白了,为什么name和name1hashCode值相同却是两个不同的键,因为他们进行equals比较的时候不同呀,name是"通话",name1是"重地",equals方法不同,自然就是同的键,
至于我们一开始举的例子,integer和integer1,他们先进行了hashCode比较,相同后再进行,equals比较,再相同才判定他们是同一个键;
这也是我们为什么常常说,为什么重写equals还要重写hashcode,这两者缺一不可

到此这篇关于浅谈java中HashMap键的比较方式的文章就介绍到这了,更多相关java HashMap键内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Log4j2及配置步骤

    SpringBoot整合Log4j2及配置步骤

    这篇文章主要介绍了SpringBoot整合Log4j2以及配置详解,删除spring-boot-starter-parent默认使用spring-boot-starter-logging依赖,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 安装elasticsearch-analysis-ik中文分词器的步骤讲解

    安装elasticsearch-analysis-ik中文分词器的步骤讲解

    今天小编就为大家分享一篇关于安装elasticsearch-analysis-ik中文分词器的步骤讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Spring Boot + Jpa(Hibernate) 架构基本配置详解

    Spring Boot + Jpa(Hibernate) 架构基本配置详解

    本篇文章主要介绍了Spring Boot + Jpa(Hibernate) 架构基本配置详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java class文件格式之访问标志信息_动力节点Java学院整理

    Java class文件格式之访问标志信息_动力节点Java学院整理

    access_flags 描述的是当前类(或者接口)的访问修饰符, 如public, private等, 此外, 这里面还存在一个标志位, 标志当前的额这个class描述的是类, 还是接口
    2017-06-06
  • SpringBoot的三大开发工具小结

    SpringBoot的三大开发工具小结

    本文主要介绍了SpringBoot的三大开发工具,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • mybatis输入映射和输出映射实例详解

    mybatis输入映射和输出映射实例详解

    这篇文章主要介绍了mybatis输入映射和输出映射,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 利用Socket.io 实现消息实时推送功能

    利用Socket.io 实现消息实时推送功能

    这篇文章主要介绍了利用Socket.io 实现消息实时推送功能,需要的朋友可以参考下
    2017-12-12
  • Automapper实现自动映射的实例代码

    Automapper实现自动映射的实例代码

    这篇文章主要介绍了Automapper实现自动映射的实例代码,需要的朋友可以参考下
    2017-09-09
  • 详解Springboot-MyBatis配置-配置端口号与服务路径(idea社区版2023.1.4+apache-maven-3.9.3-bin)

    详解Springboot-MyBatis配置-配置端口号与服务路径(idea社区版2023.1.4+apache-mav

    这篇文章主要介绍了Springboot-MyBatis配置-配置端口号与服务路径(idea社区版2023.1.4+apache-maven-3.9.3-bin),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Java中Iterator迭代器的简单理解

    Java中Iterator迭代器的简单理解

    这篇文章主要介绍了Java中Iterator迭代器的简单理解,Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Iterator主要用于迭代访问Collection中的元素,因此Iterator对象也被称为迭代器,需要的朋友可以参考下
    2024-01-01

最新评论