浅谈hashcode()与equals()

Posted Ferron Zhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈hashcode()与equals()相关的知识,希望对你有一定的参考价值。

1、介绍

  • hashcode():该方法是用来获取一个对象的哈希码,也称散列码。在Java中为什么需要有哈希码呢?比较两个对象相等直接用==或者equals不就行了吗?我们知道Java中集合(Collection)有两类,一种是List,另一种是Set,前者是有序可重复的,后者是无序不可重复的。我们拿Set来说,当我们将一个元素加入到Set里面时,怎么判断这个元素是否已经存在在这个Set里面了呢?用equals?虽然说这是一种方法,但是如果这个Set里面有100w个元素,每加入一个元素就需要调用100w次equals方法,这显然是不现实的!哈希码存在的意义就是直接将元素根据哈希算法指定到一个特定的地址上,这样每次Set存储一个元素就直接计算哈希值并依据其哈希值将其存储到特定的内存地址,如果该地址已经有数据了,则添加失败,这也大大地提高了效率。
  • equals():该方法是用来判断两个对象内存地址是否相同的方法,如果该方法被重写了,则依据其具体重写的内容来判断其具体功能,一般重写之后变成判断两个对象的值是否相同。

2、区别

  • 如果两个对象的hashcode()返回值一样,其equals()返回结果不一定一样。
  • 如果两个对象的hashcode()返回值不一样,其equals()返回结果一定不一样。
  • 如果两个对象的equals()返回值一样,其hashcode()返回结果一定一样。
  • 如果两个对象的equals()返回值不一样,其hashcode()返回结果不一定不一样。

3、理解

  • 当你需要重写equals()方法时,则最好重写hashcode()方法。因为如果你重写了equals()方法而不重写hashcode()方法,则你写的类equals()方法是你自己重写的,可以判断两个对象的值是否相等,而hashcode()则是Object父类的方法,比较的是两个对象的内存地址。当你new了两个值相同的对象时,其内存地址大概率不相等,因此其hashcode()显示的是两个值的哈希码不相等,此时按照惯例判断其equals()方法返回的结果一定不一样,但是重写过的方法比较对象的值,因此equals()方法返回的结果是一样的,因此出现了歧义。
  • hashcode()equals()的存在都是有意义的,一般程序对比两个对象是否相同不会直接调用equals(),而是先调用hashcode(),只有当两个对象的哈希码相同时,才会进一步调用equals()来对两个对象进行比较,这大大地提高了效率。

以上是关于浅谈hashcode()与equals()的主要内容,如果未能解决你的问题,请参考以下文章

Java ==,equals() 和hashCode

Java equals 方法与hashcode 方法的深入解析

代码安全 | 第十七期:对象只定义了Equals和Hashcode方法之一的漏洞

hashCode()与 equals() 之间的关系

equals与hashcode分析

hashCode与equals的区别与联系