重写equals、hashcode
public class User {
private int id;
private String name;
private String gender;
private int age;
private Date birthday;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
age == user.age &&
Objects.equals(name, user.name) &&
Objects.equals(gender, user.gender) &&
Objects.equals(birthday, user.birthday);
}
@Override
public int hashCode() {
return Objects.hash(id, name, gender, age, birthday);
}
// get、set、toString
}
执行情况:
有关hashcode
根据源码得知
Returns a hash code value for the object.
返回对象的hash值
If two objects are equal according to the equals(Object) method, then calling the hashCode() method on each of the two objects must produce the same value.
如果两个对象相等(根据equals()方法判断),则hashCode()方法返回的值相同
It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, developers should be aware that producing distinct integer results for unequal objects improves the performance of hash tables.
当equals()方法返回的不相等,则没有要求hashCode()方法必须返回不同的int值,但是开发人员应该为不相等的对象生成不同的整数结果,这样可以提高hash表的性能
hashCode()方法在Object规范中的通用约定:
在应用运行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么多次调用该对象的equals方法应该始终如一的返回同一个整数。在同一个应用程序的多次执行过程中,每次执行equals方法所返回的整数可以不一致。
如果两个对象使用equals(Object)方法比较是相等的,那么调用这两个对象中的任意一个对象的hashCode方法都必须产生相同的一个整数结果。
如果两个对象使用equals(Object)方法比较是不相等的,那么调用这两个对象中的任意一个对象的hashCode方法,则不一定要产生不同的整数结果。如果给不同的对象产生不同的hash码,有可能提高散列表性能(比如往HashMap中添加数据时,具体添加到哪个桶中,就是根据(table.length - 1) & hash来计算的)。
所以,根据以上的hashCode通用约定我们就可以知道:如果重写了equals方法而没有重新hashCode方法的话,将会违反hashCode通用约定的第二个约束条件:相等的对象必须具有相等的散列码。