Hibernate 系列 08 - 对象识别机制
发布时间:2016-10-31 10:52:07 所属栏目:教程 来源:站长网
导读:副标题#e# Hibernate 系列 学习笔记 目录 为了区别不同的对象,有两种识别方法: 1. 内存地址识别(==号识别) 2. equals()和hashCode()识别 如果两个对象的内存地址相同,毫无疑问,它们是相同的。 如果要比较的是对象携带的信息,使用内存地址识别就不可
例如:若studentNo的类型是String,代码如下: 1 public class Student { 2 3 @Override 4 public boolean equals(Object obj) { 5 if (this == obj) return true; // 如果内存地址相等,返回true 6 if (this.studentNo == null || !(obj instanceof Student)) return false; 7 Student stu = (Student) obj; 8 return this.studentNo.equals(stu.studentNo); 9 } 10 11 @Override 12 public int hashCode() { 13 return this.studentNo.hashCode(); 14 } 15 16 }
通过studentNo来比较对象是否相等存在一些问题。 因为当一个对象被new出来而还没有save()的时候,它并不会被赋予studentNo值,这是这个方法就不太适合了。 通常使用的方法是根据对象中真正包含的属性值来做比较,例如: 1 public class Student { 2 3 @Override 4 public boolean equals(Object obj) { 5 if (this == obj) return true; // 如果内存地址相等,返回true 6 if(!(obj instanceof Student)) return false; 7 Student stu = (Student)obj; 8 if(!getStudentName().equals(stu.getStudentName())) return false; 9 if(!getBornDate().equals(stu.getBornDate())) return false; 10 return true; 11 } 12 13 // 通过一个简单的算法得到哈希码 14 @Override 15 public int hashCode() { 16 int result; 17 result = getStudentName().hashCode(); 18 result = 29*result+getBornDate().hashCode(); 19 return result; 20 } 21 22 }
上述例子不再简单地比较studentNo值了,而是根据学生姓名和生日对Student对象实例进行比较。因为基本上名字和生日就能确定一个人的身份了。 当然,实现的方法还有很多,也可以使用其他的属性来比较Student的身份,这就要根据实际的需求来决定了。
(编辑:常州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |