微信搜索🔍「码农田小齐」,关注这个在纽约的程序媛,回复「01-05」能够获取计算机精选书籍、我的刷题笔记、大厂面经、面试资料等资源,么么哒~git
首先咱们有一个假设:任何两个 object 的 hashCode 都是不一样的。github
那么在这个条件下,有两个 object 是相等的,那若是不重写 hashCode(),算出来的哈希值都不同,就会去到不一样的 buckets 了,就迷失在茫茫人海中了,再也没法相认,就和 equals() 条件矛盾了,证毕。web
撒花~~🎉🎉🎉面试
接下来咱们再对这两个方法一探究竟:数组
其实 hashCode() 和 equals() 方法都是在 Object class 这个老祖宗里定义的,Object 是全部 Java 中的 class 的鼻祖,默认都是有的,甩不掉的。微信
那既然是白给的,咱们先来看看大礼包里有什么,谷歌 Object 的 Oracle 文档:编辑器
因此这些方法都是能够直接拿来用的呢~ide
回到 hashCode() 和 equals(),那么若是这个新的 class 里没有重写 (override) 这两个方法,就是默认继承 Object class 里的定义了。学习
那咱们点进去来看看 equals() 是怎么定义的:flex
记笔记:
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() 返回的到底是什么,和本文关联不太大,有兴趣的同窗能够看参考这篇文章[1],结论就是:
返回的并不必定是对象的(虚拟)内存地址,具体取决于运行时库和JVM的具体实现。
但不管是怎么实现的,都须要遵循文档上的约定,也就是对不一样的 object 会返回惟一的哈希值。
因此说,
hashCode() 决定了 key 放在这个桶里的编号,也就是在数组里的 index;
equals() 是用来比较两个 object 是否相同的。
若是你喜欢这篇文章,记得给我点赞留言哦~大家的支持和承认,就是我创做的最大动力,咱们下篇文章见!
我是小齐,纽约程序媛,终生学习者,天天晚上 9 点,云自习室里不见不散!
更多干货文章见个人 Github: https://github.com/xiaoqi6666/NYCSDE
hashCode()参考文章: https://blog.csdn.net/xusiwei1236/article/details/45152201