黑马程序员技术交流社区

标题: 直播解释 ==和equals和hashCode 不懂的速来 [打印本页]

作者: jy6728228    时间: 2016-4-28 17:42
标题: 直播解释 ==和equals和hashCode 不懂的速来

说这个之前,先说new是干嘛了。
Student stu = new Student();
stu就是计算机中的一个0x503f6430 的一个地址,放在栈中。指向了另一个区域,这个区域叫做堆。
当然这个只是为了方便你们这群蛋疼的人理解说的。实际上,计算机没这么多脑筋。就是指来指去。学了C++的人就不用往下看了。

那么
String s1="a";
String s2="a";
就是说s1指向了 0x503f6430 这个地址的首地址。
s2指向了0x405233F1。
我现在就问
0x503f6430 等于 0x405233F1 吗?
明显,假设你是正常人的话,知道是不等于的。

那么你这样干的话,我怎么表达"a"就是"a",无论你怎么写都是a,你不相等的话,不是在逗我吗?
这时候出来了equals。
先看String类型的equals(翻译成中文就是等于的意思)。
我们来跟进源码



上面就是String类的euqals.
首先判断指向的地址是不是一样的:this == anObject
在进行类型判断:anObject instanceof String
最后迭代String里面的每一个char,如果都相等的话,就相等。并返回true.
那么s1 == s2 就是说  0x503f6430 等于 0x405233F1 吗?
s1.equals(s2) 呢就是说: 遍历s1的每一个char和s2的每一个char。都相等,才OK。

VLEQUONOKG$}NMR4S0]4CDD.png (4.04 KB, 下载次数: 10)

VLEQUONOKG$}NMR4S0]4CDD.png

作者: jy6728228    时间: 2016-4-28 17:50
15人回帖后,接着讲诉关于hashCode 的应用和equals的灵活应用
作者: fanlelong    时间: 2016-4-28 20:24
顶一个先
作者: jy6728228    时间: 2016-4-29 00:00
本帖最后由 jy6728228 于 2016-4-29 00:02 编辑

写的这么好居然没人看。
算了,我接下来接着写关于equals和hashCode的问题。

好,首先我们搞清楚了equals是干嘛的。那么hashCode又是什么鬼东西?完全搞不懂好吗?这难道是SUN来逗我们玩的? 我觉得很有可能。

接下来就找一个与hashCode有关的。

HashMap,这玩意听着就跟Hash有关系,我们去看看他的get方法到底干了什么东西。

给出一个小栗子
Dog.java 下面的它的equals和hashCode

那么接下来我们用HashMap的实现去玩一玩这个新东西

运行结果:n u l l

OK,那么问题来了。为什么是NULL值呢?
不是说好的重写等于就可以了吗。SUN 你这个大骗子。
逗爹玩呢。
好吧不管那么多,跟进去看看HashMap里面到底干了一些什么鬼东西。在这样搞我就抓狂啊。。。。。。

接下来去跟进HashMap的get方法


日了狗了,怎么又取Entry,不过这次仍然是自己内里面定义的内部内,不是之前TreeMap里面的了。
接着去看getNode干了啥,应该就是这个逗比没找到我想要的东西,所以才没给我返回。


兔崽子,让我逮住你在哪里了吧。

因为在入口处传了hash值。但是呢,你put进来的hash 不等于我这里取到的hash。所以我返回了null值(Dog类中的hashCode()是故意写成随机很大范围,是为了put和get 传给HashMap的hash值不一样)。

那么最后收官定论。

当出现HashMap,HashSet,LinkedHashList.
跟hash有关的时候,你就必须让Hash的值准确,不能只重写equals却不重写hashCode.
当然你用TreeMap的话就无所谓了。  除了TreeMap。 目前就没看到不是Hash实现的Map。
然而List里面也有Hash实现。

那么只要跟hash有关的实现,那么你就肯定会有错。
当然我们平时更多的是用的String.现在在想想,sun把String写成final是不是就是担心你们这群大傻,重写equals不重写hashCode呢?

那么下面在给一个强制不重写hashCode,但是却要能找到的Map的黑科技。



按照这种写法,你就不会碰到hashCode的问题,然而平时开发并没有谁写这么多费代码,去难为自己吧。

所以呢,你一旦要重写equals请务必重写hashCode,免得别人调用你的类,却发现他妈的到hashMap这里面不能用。


最后留一个QQ:344104344

欢迎吐槽。。。。。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2