ORM框架原理与应用
第三次作业 重写hashCode和equals
一、为什么要重写hashCode和equals
equals方法和hashcode方法均被重写,Integer类中的hashcode方法就是返回它本身的值,equals方法比较的是它本身的值是否相等。
而equals方法必须要满足以下几个特性
1.自反性:x.equals(x) == true,自己和自己比较相等
2.对称性:x.equals(y) == y.equals(x),两个对象调用equals的的结果应该一样
3.传递性:如果x.equals(y) == true y.equals(z) == true 则 x.equals(z) == true,x和y相等,y和z相等,则x和z相等
4.一致性 : 如果x对象和y对象有成员变量num1和num2,其中重写的equals方法只有num1参加了运算,则修改num2不影响x.equals(y)的值
而这时如果某个类没有重写hashcode方法的话,equals判断两个值相等,但是hashcode的值不相等,如String类,这样就会造成歧义
二、hashCode()相同,equals()也一定为true吗?
不一定,equals() 为true,hashCode() 也不一定相同。
类的 hashCode() 方法和 equals() 方法都可以重写,返回的值完全在于自己定义。
hashCode() 返回该对象的哈希码值;equals() 返回两个对象是否相等。
关于 hashCode() 和 equals() 是方法是有一些 常规协定:
1、两个对象用 equals() 比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。
2、两个对象用 equals() 比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,以提高哈希表性能。
3、重写 equals() 方法,必须重写 hashCode() 方法,以保证 equals() 方法相等时两个对象 hashcode() 返回相同的值。
三、实现过程
package pojo;
import java.util.Date;
import java.util.Objects;
public class User {
private int id;
private String name;
private String gender;
private int age;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = 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);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
try{
sf =HibernateUtil.getSessionFactory();//sessionFactory单态模式
session = sf.getCurrentSession();//保证每个读写线程有唯一的session的实例
ts = session.beginTransaction();
User user1 = new User();
User user2 = new User();
user1.setId("1814010917");
user2.setId("1814010917");
System.out.println(user1==user2);
System.out.println(user1.equals(user2));
ts.commit();
}
总结
讲述了如何重写hashCode和equals