天天看点

为什么重写equals()时必须要重写hashcode()??(清晰明了!)

为什么重写equals时必须要重写hashcode??

  • 为什么需要重写equasl方法???
  • 为什么类重写equals时必须重写hashcode??
  • 通过hashcode和equals搭配比较对象是否相等,是如何提高效率的???

为什么需要重写equasl方法???

equasl()方法是Object中的方法,用于判断两个对象是否相等

public  boolean  equals(Object   obj ) {
        return   ( this   ==   obj   );
   }
           

我们如果想通过该方法来判断对象是否相等,那么需要重写;

当然,不重写也可以判断对象是否相等,但是这样没有意义!!!因为不重写比较的对象地址,同一个对象,地址肯定一样呀!!

我们所说的对象相等,是指两个对象的内容一样!!!

为什么类重写equals时必须重写hashcode??

hashcode()方法默认是本地方法,返回的是对象地址的10进制数表示!!

(1) 如果不重写,那么会导致该类无法结合所有基于散列的集合一起正常工作,比如hashset,hashmap等

这里拿hashset举例

为什么重写equals()时必须要重写hashcode()??(清晰明了!)

hashset是不重复的,那么他是怎么判断是否重复的呢??

就是通过hashcode和equasl方法结合来判断的!!!

假如我们只重写了equals方法,那么在添加s3时,会进入if判断时,遍历entry数组,查找是否有相等的hashcode;

由于s1和s3是不同的对象,因此他们的hashcode不等,从而走下面的addEntry()把s3添加进set集合

这样就导致set失去了他不重复的特性!!

为什么重写equals()时必须要重写hashcode()??(清晰明了!)

(2)还会违反Object.hashcode的通用规定!!!

为什么重写equals()时必须要重写hashcode()??(清晰明了!)

为什么不重写就会违反呢???

student s1 =  new student("zhangsan",18);
student s2 =  new student("zhangsan",18);
           

这里重写equals方法后,判断s1.equasl(s2)为true,

但是我们没有重写hashcode,那么就会比较两个对象地址是否相等,显然这两个对象地址不等!!

违反了其中的一条是:

如果两个对象根据equals方法比较是相等的,那么两个对象调用hashcode的值也相等!!

通过hashcode和equals搭配比较对象是否相等,是如何提高效率的???

hashset的put方法就是如此!!

为什么重写equals()时必须要重写hashcode()??(清晰明了!)

继续阅读