java中==和equals和hashCode的区别(Android每日面试题)

1,392 阅读4分钟

前言

看见即降服,这句话说的是一件事物,只要你看得到,你就能得到。

对我来说记录就是看见。

面试题不只是为了面试,更是为了帮助我们更深入地理解我们已知的知识。

==的作用

分两种情况

  • ==前后的数据类型是基本数据类型的话,如int,long等,==对比的是它们的值
  • ==前后的数据类型是引用数据类型的话,==对比的是引用所指向对象的内存地址

equals()的作用

首先说一下equals()方法是哪个类的,很显然equals()方法是在基类Object类中的,包括下面要说的hashCode()方法也在Object中,也就是说只要我们新建一个类,这个类里面即使什么都没有,它也会有equals()和hashCode()这两个方法,因为所有的类都继承自Object。

接下来我们说一下equals()方法的作用,equals()方法本意是用来比较两个对象的内容是否相等的。但是这个方法在Object类中的实现是使用==来对比两个对象,也就是说,如果我们创建一个类,没有重写equals()方法的话,调用的是Object中的equals()方法,那么对比的结果和使用==的效果是一样,都是对比的对象的内存地址。

所以equals()的作用分两种情况

  • 没有重写equals()时,和使用==的效果一样
  • 重写equals()时,对比的结果依据实现的方式来定。

题外话

一般重写equals()方法分三个步骤:1.使用==来判断是否相等(相等说明引用指向的是同一个内存地址);2.判断类型是否一致(如果类型不一致,那两个对象肯定不相等);3.根据实际情况判断对象的属性是否相等。

重写的equals()方法的同时必要时也应该重写hashCode()方法(下文会解释为什么是必要时),再者,重写的equals()方法需要满足一下几个条件:

1.自反性,x.equals(x)

2.对称性,x.equals(y),y.equals(x)

3.传递性,x.equals(y),y.equals(z),x.equals(z)

4.一致性,不管程序运行多少次,x.equals(y)的结果始终不变

5.任何不等于null的对象调用equals(null)都等于false

hashCode()的作用

hashCode()方法的作用是计算对象的hash值,该方法会返回一个int值。

那么它的作用是什么?或者说什么情况下才会使用该方法?这个问题可以查看文章底部的参考链接

这里简单解释一下,一般只有在使用到hash表的时候才会使用hashCode方法,那么什么地方会使用hash表呢?一般我们的集合,如HashMap,Hashtable,HashSet等这些类会使用hash表。

==和equals()的区别和联系

上面已经说过了,只有在没有重写equals()时,才和使用==的效果一样

equals()和hashCode()的联系

通过阅读我们上面的几个问题,我们会发现equals()和hashCode()这两个方法好像没有任何联系。事实上,只有一种情况下他们会被同时用到,那就是我们创建的类会被用在HashMap,Hashtable,HashSet等集合中时(本质是需要用到hash表),必须同时重写这两个方法,这就是他们之间的联系(可查看文章底部的参考链接),我在下面说一下我的理解。

假设我们现在的需求是将我们创建的类放入HashSet中,HashSet集合是不允许有相同的元素的。如果我们创建的类只重写了equals()方法,当我们将我们创建的类的两个对象A和B放入HashSet的时候,底层会调用equals()和hashCode()两个方法来比较A和B是否相等,假如这个时候A和B的equals()返回true,因为我们没有重写hashCode(),所以A和B的hashCode()值是不一样的,这时候HashSet会认为我们的A和B是不同的元素,因此,我们的A和B都会被加进去。但是事实上,在我们看来的A和B是相等(因为equals()方法返回true),不应该同时被放入HashSet。这就是矛盾点,所以我们重写equals()的时候需要带上hashCode(),以免造成不可预知的错误。

下面引用一下参考文章中equals()和hashCode()有联系时候的结论:

在这种情况下,该类的“hashCode() 和 equals() ”是有关系的:

1)、如果两个对象相等,那么它们的hashCode()值一定相同。

  这里的相等是指,通过equals()比较两个对象时返回true

2)、如果两个对象hashCode()相等,它们并不一定相等。

  因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。补充说一句:“两个不同的键值对,哈希值相等”,这就是哈希冲突。

参考

www.jianshu.com/p/5a7f5f786…