欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈java中HashMap键的比较方式

程序员文章站 2022-03-21 13:21:12
先看一个例子 integer integer=12344; integer integer1=12344;在java中integer 和integer1是不相等的,但是如果再执行如下语句map.pu...

先看一个例子

 integer integer=12344;
  integer integer1=12344;

在java中integer 和integer1是不相等的,但是如果再执行如下语句

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

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

浅谈java中HashMap键的比较方式

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

浅谈java中HashMap键的比较方式

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

浅谈java中HashMap键的比较方式

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

浅谈java中HashMap键的比较方式

然后输出他们的hashcode值

浅谈java中HashMap键的比较方式

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

浅谈java中HashMap键的比较方式

看看他的输出结果

浅谈java中HashMap键的比较方式

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

浅谈java中HashMap键的比较方式

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

浅谈java中HashMap键的比较方式

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

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