乐趣区

关于java:为什么重写-equals-方法一定要重写-hashCode-呢-HashMap

微信搜寻????「码农田小齐」,关注这个在纽约的程序媛,回复「01-05」能够获取计算机精选书籍、集体刷题笔记、大厂面经、面试材料等资源,么么哒~

首先咱们有一个假如:任何两个 object 的 hashCode 都是不同的。

那么在这个条件下,有两个 object 是相等的,那如果不重写 hashCode(),算进去的哈希值都不一样,就会去到不同的 buckets 了,就迷失在茫茫人海中了,再也无奈相认,就和 equals() 条件矛盾了,证毕。

撒花~~????????????

接下来咱们再对这两个办法一探到底:

其实 hashCode() 和 equals() 办法都是在 Object class 这个老祖宗里定义的,Object 是所有 Java 中的 class 的鼻祖,默认都是有的,甩不掉的。

那既然是白给的,咱们先来看看大礼包里有什么,谷歌 Object 的 Oracle 文档:

所以这些办法都是能够间接拿来用的呢~

回到 hashCode() 和 equals(),那么如果这个新的 class 里没有重写 (override) 这两个办法,就是默认继承 Object class 里的定义了。

那咱们点进去来看看 equals() 是怎么定义的:

记笔记:

equals() 办法就是比拟这两个 references 是否指向了同一个 object.

嗯???你在逗我吗??那岂不是和 == 一样了??

补充:
咱们罕用的比拟大小的符号之 ==
如果是 primitive type,那么 == 就是比拟数值的大小;
如果是 reference type,那么就比拟的是这两个 reference 是否指向了同一个 object。

再补充:
Java 的数据类型能够分为两种:
Primitive type 有且仅有 8 种:byte, short, int, long, float, double, char, boolean.
其余都是 Reference type.
所以尽管 Java 宣称“Everything is object”,然而还是有非 object 数据类型的存在的。

我不信,我要去源码里看看它是怎么实现的。

哈,还真是的,绕了这么半天,equals() 就是用 == 来实现的!

那为什么还弄出来这么个办法呢?

答:为了让你 override~

比方一般来说咱们比拟字符串就是想比拟这两个字符串的内容的,那么:

str1 =“tianxiaoqi”;
str2 =  new String(“tianxiaoqi”);

str1 == str2; // return false
str1.equals(str2); // return true 

因为 String 里是重写了 equals() 办法的:

老祖宗留给你就是让你本人用的,如果你不必,那人家也提供了默认的办法,也是够意思了。

好了,咱们再去看 hashCode() 的介绍:

那至于 hashCode() 返回的到底是什么,和本文关联不太大,有趣味的同学能够看参考这篇文章参考文章 ”),论断就是:

返回的并不一定是对象的(虚构)内存地址,具体取决于运行时库和 JVM 的具体实现。

但无论是怎么实现的,都须要遵循文档上的约定,也就是对不同的 object 会返回 惟一的哈希值

所以说,

hashCode() 决定了 key 放在这个桶里的编号,也就是在数组里的 index;

equals() 是用来比拟两个 object 是否雷同的。

如果你喜爱这篇文章,记得给我点赞留言哦~你们的反对和认可,就是我创作的最大能源,咱们下篇文章见!

我是小齐,纽约程序媛,终生学习者,每天晚上 9 点,云自习室里不见不散!

更多干货文章见我的 Github: https://github.com/xiaoqi6666…

退出移动版