微信搜寻????「码农田小齐」,关注这个在纽约的程序媛,回复「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…