hashcode与equals的作用区别和联系

Posted hjdk05

tags:

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

简介:

hashCode与equals这一对看似作用相同但细品却有着很大的区别,都是值比较而你我却有着不同的衡量标准。不如我们一起约定一个规则,来更好的为程序服务吧

有这么两个结论:

1、equals相等的两个对象他们的hashCode肯定相等,因此equals是绝对可靠的。

2、hashCode相等的两个对象他们的equals不一定相等,因此hashCode不是绝对可靠的。

什么是HashCode(哈希码)

hashCode()的作用就是获取哈希码,它是一个int整数。这个哈希码的作用是确定该对象在散列表中的索引位置。hashCode定义在java.Object中,意味着每个类都有hashCode函数。
public class Demo{
       public static void main (String []args){
              String  str = "aa";
              System.out,println(str.hashCode())
      }
}
             //结果为
3104

什么是equals

判断两个对象是否相等,就是“==”,两个对象的地址是否相同;如果对象重写了equals()的方法,则比较对象的内容是否相等。同样的equals定义在java.Object中,Java中任何类都有equals方法。

下图是不重写equals()的方法

技术图片

 

技术图片

 

 那么由于两个对象的地址不同,所以得到的hashCode不同,即使他们的name一样,但是“==”与“equals()”都不相等,返回为false.

 

      如果我们想要两个name相等的两个对象让它被系统认为是同一个,即调用equals()方法或者“==”时返回true,那么就需要重写equals方法了。而且在很多的情景下,我们判断两者是不是同一个name时,不需要判断其他信息,比如地址。怎么重写呢?

重写equals()方法还需要满足几个条件

  • 自反性:对于任意的非空引用x, x.equals(x)返回为true。
  • 对称性:对于任意引用x和y,  x.equals(y)返回true,则y.equals(x)返回也应该为true。
  • 传递性:对于任意引用x,y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
  • 一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)得到的结果不变。
  • 非空性:对于任意非空引用x, x.equals(null)的结果应该为false。

重写equals方法就必须重写hashCode方法,因为你返回true那么地址值也要相等这样的条件才能保证equals相等

 

 

以上是关于hashcode与equals的作用区别和联系的主要内容,如果未能解决你的问题,请参考以下文章

hashcode()和equals()的作用区别联系

hashcode() 和 equals() 的作用 区别 联系

hashcode和equals方法的区别与联系

hashCode与equals的区别与联系

hashcode() & equals()的联系和区别

Java hashCode() 和 equals()的若干问题