为什么要重写equals方法和hashcode方法

首先要了解,

  没有重写的hashCode值是根据内存地址换算出来的一个值;

  没有重写的equals方法就相当于==。

在业务中,有时候不是去判断两个对象是否是严格意义上的相等,而是想判断是否是业务上的相等,

举个例子,一个Student类中的两个属性,姓名和身份证,

public class Student{
  String name;//姓名
  long id;//身份证    
}

如果在业务上认为两个对象的"姓名+身份"证都相同的情况下,则是相等的,

这个时候在不重写equals方法的情况下,

    Student s1 = new Student("jack",123456);
    Student s2 = new Student("jack",123456);
    System.out.println(s1.equasls(s2));//false
    

业务上我们认为这是同一个学生,s1.equasls(s2)应该是相等的,而结果却是false,

这就就不符合我们的业务需求,所以需要重写equals方法,

public boolean equals(Object o){
    if (o == null) return false;
    if (o instanceof Student) {
        Student s = (Student)o;
        if (this.name==s.name && this.id==s.id) return true;   
     }
    return false;
}     

这样,s1.equals(s2)就是true了。

那为什么要重写hashcode方法呢?

如果重写了equals方法,就有必要重写hashcode方法,来保证

"如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。" ----Object.hashCode的通用约定。

猜你喜欢

转载自www.cnblogs.com/mianduijifengba/p/10490250.html