首先要了解,
没有重写的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的通用约定。
原文:https://www.cnblogs.com/mianduijifengba/p/10490250.html