加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

Hibernate 系列 08 - 对象识别机制

发布时间:2016-10-31 11:54:52 所属栏目:教程 来源:站长网
导读:副标题#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的身份,这就要根据实际的需求来决定了。

 

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读