Java 中 == , equals 与 hashCode 的区别与联系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/yichen97/article/details/90045808

引言

关于 “==”、equals 和 hashCode,有时候不知道应该用哪个,感觉很多结果都是一样的,甚至乱用。为了以后不至于写错都不知到怎么错的,做一个笔记。

简述

==:比较两者之间的关系,这个关系在基本数据类型和引用类型变量中的比较有所差异。

equals:比较两对象的内容。

hashCode:比较对象在hash表中的位置。

" == "

1. 在基本数据类型(float、double、byte、short、int、long、char、boolean)中,由于JVM是直接存储的值,所以比较的是值。

2. 在引用类型变量中,JVM所存储的只是对象的引用,对象的创建会创建到堆内存中,所以比较的是内存地址是否相同。

JVM存储疑惑戳这里

equals

1. 由于equals()是Object的实例,则所有继承Object的类都会有这个方法。

扫描二维码关注公众号,回复: 7195238 查看本文章
public boolean equals(Object obj) {
    return (this == obj);
}

2. 在各自的类中,equals()方法总会根据各自类的特征被重写以适应。

以被讲烂了的String.java为例:

1. 首先,在 if(this == anObject) 中,先对比了两个对象的引用地址,若相同,两对象肯定为同一个对象,所以直接返回true;

2. 走完第一步,就已确定是两个对象,但却不知道两对象是什么情况。然后在 if(anObject instanceof String) 判断传入的对象是否为String类型,这里因为以String为例,所以是String。其实就是判断两个对象类型是否相同,若不相同,连类型都不相同了,内容肯定不同,所以直接返回false;如果类型相同,则继续比较。

3. 因为我这源码是从 Android O 上摘的,不是很旧,这里中间又多了一步 if(n == anotherString.length()) 来先比较一下长度,长度不符合,直接返回false。添加这一个判断我感觉优化了很多,毕竟下面的操作要一点一点的内容做比较,比较耗资源,这样一来,有几率的提高了速度。

4. 最后就是比较内容了,相同为true,不同为false。

hashCode

1. 在说hashCode之前,应先了解下什么是hash?什么是hash表?

hash:是一个函数,这个函数里面有一系列的算法,然后通过这个函数所得到的一个值,这个值就是hash值。

hash表:顾名思义,由hash值所组成的表。

2. 什么是hashCode?

hashCode是通过hash函数得到的,表示在hash表中的位置。

3. hashCode != 对象的物理地址

hashCode:对象在hash表中的位置;

物理地址:对象存放在内存中的地址。

4. hashCode是怎样产生的?

现将对象的物理地址转化成一个整数,然后该整数通过hash函数的算法就得到了hashCode。

5. 为什么要用hashCode?

是为了查找的快捷,在散列存储结构中快速确定对象的存储地址。

假如说有一个集合{1,2,3,4,5,……98,99,100}。现在要放入一个数101,如果按遍历的方式,则需要挨个判断1~100个数是否其中有相同的数。

如果用hashCode:

假设这个表中有9个位置,则这个1~100的集合再假设这样放。

如果现在需要插入一个数,那么只要先查hashCode表中所对应的数,假设是1,则它只需要与HashCode表中位置为1的数做对比就可以了。

6. equals方法和hashCode关系?

如果两个对象equals相等,那么这两个对象的hashCode一定相同;

如果两个对象的hashCode相同,不代表两个对象相同,只能说明,两个对象在散列存储结构中存放于同一个位置。

7. 重写equals方法时,需要重写hashCode方法吗?

如果重写了equals而未重写hashCode,可能会出现两个没有关系的对象equals相同,但hashCode确实不同。equals是根据对象的特征去重写,而hashCode没有被重写,这样就无法满足如果两个对象equals相等,那么这两个对象的hashCode一定相同。

所以重写equals方法时,重写hashCode方法。

参考文献

https://blog.csdn.net/justloveyou_/article/details/52464440

https://www.cnblogs.com/xudong-bupt/p/3960177.html

https://blog.csdn.net/qq_36522306/article/details/80550210

https://www.cnblogs.com/whgk/p/6071617.html

猜你喜欢

转载自blog.csdn.net/yichen97/article/details/90045808