关于hibernate中实体中equals和hashcode方法的重写
来源:互联网 发布:有没有在美迪学淘宝的 编辑:程序博客网 时间:2024/06/08 03:16
ZJ 21:00:06
对了 老师,为什么在HIBERNA里要重写HASCODE 和EQUALS这两个方法?
付老实 21:04:22
equals用来按照自己的规则判断两个对象是否相等,而重写了equals后,按照java的惯例,就需要重写hashCode
ZJ 21:05:11
老师 只看懂的一点点呀,再稍微说多点啊!
付老实 21:08:04
这么说罢
付老实 21:08:23
1,重点是equals,重写hashCode只是技术要求(为了提高效率)
2,为什么要重写equals呢,因为在java的集合框架中,是通过equals来判断两个对象是否相等的
3,在hibernate中,经常使用set集合来保存相关对象,而set集合是不允许重复的,但是下面的程序,你判断一下运行结果
Set user = new HashSet();
user.add(new Book("精通struts"));
user.add(new Book("精通struts"));
System.out.println(user.size());
Neo 21:10:48
这两个为什么相同阿???
就是说set集合是按照equals来判断是否重复的?
付老实 21:12:00
恩,猜一下打印的结果
ZJ 21:11:31
应该输出1吧,或许报错 呵呵
付老实 21:12:44
错了
付老实 21:12:58
完全取决于Book类有没有重写equals方法
付老实 21:13:39
如果没有重写,默认equals是比较地址,那么这两个book对象不一样,输出2,意味着hibernate会认为这是两个对象,再接下来的持久化过程中可能会出错
付老实 21:14:07
如果重写了equals,比如按照主键(书名)比较,那么这两个对象是一样的,输出1
付老实 21:14:10
明白了?
ZJ 21:13:26
明白了
付老实 21:14:32
再说hashCode
ZJ 21:13:51
恩
付老实 21:14:57
equals方法虽好,但是效率相对底下
ZJ 21:14:43
老实接着说说
付老实 21:15:45
典型的equals实现
public boolean equals(Object obj) {
Book b = (Book)obj;
return this.name.equals(b.name);
}
付老实 21:16:43
其间需要向下转型,调用其他类的equals等操作,有可能比较费时,特别是比较规则比较复杂的时候
ZJ 21:16:33
恩 能理解
付老实 21:18:04
而hashCode为每一个对象生成一个散列码(通过一种神秘的算法,一般为关键属性乘以一个质数),避免了比较慢的运算
付老实 21:18:27
但是hashCode并不能保证能为每一个不同的对象生成唯一的散列码
ZJ 21:18:34
那若是散列码重复了呢?
付老实 21:19:59
所以在java的集合中,判断两个对象是否相等的规则是:
1,判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2
2,判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
完毕
对了 老师,为什么在HIBERNA里要重写HASCODE 和EQUALS这两个方法?
付老实 21:04:22
equals用来按照自己的规则判断两个对象是否相等,而重写了equals后,按照java的惯例,就需要重写hashCode
ZJ 21:05:11
老师 只看懂的一点点呀,再稍微说多点啊!
付老实 21:08:04
这么说罢
付老实 21:08:23
1,重点是equals,重写hashCode只是技术要求(为了提高效率)
2,为什么要重写equals呢,因为在java的集合框架中,是通过equals来判断两个对象是否相等的
3,在hibernate中,经常使用set集合来保存相关对象,而set集合是不允许重复的,但是下面的程序,你判断一下运行结果
Set user = new HashSet();
user.add(new Book("精通struts"));
user.add(new Book("精通struts"));
System.out.println(user.size());
Neo 21:10:48
这两个为什么相同阿???
就是说set集合是按照equals来判断是否重复的?
付老实 21:12:00
恩,猜一下打印的结果
ZJ 21:11:31
应该输出1吧,或许报错 呵呵
付老实 21:12:44
错了
付老实 21:12:58
完全取决于Book类有没有重写equals方法
付老实 21:13:39
如果没有重写,默认equals是比较地址,那么这两个book对象不一样,输出2,意味着hibernate会认为这是两个对象,再接下来的持久化过程中可能会出错
付老实 21:14:07
如果重写了equals,比如按照主键(书名)比较,那么这两个对象是一样的,输出1
付老实 21:14:10
明白了?
ZJ 21:13:26
明白了
付老实 21:14:32
再说hashCode
ZJ 21:13:51
恩
付老实 21:14:57
equals方法虽好,但是效率相对底下
ZJ 21:14:43
老实接着说说
付老实 21:15:45
典型的equals实现
public boolean equals(Object obj) {
Book b = (Book)obj;
return this.name.equals(b.name);
}
付老实 21:16:43
其间需要向下转型,调用其他类的equals等操作,有可能比较费时,特别是比较规则比较复杂的时候
ZJ 21:16:33
恩 能理解
付老实 21:18:04
而hashCode为每一个对象生成一个散列码(通过一种神秘的算法,一般为关键属性乘以一个质数),避免了比较慢的运算
付老实 21:18:27
但是hashCode并不能保证能为每一个不同的对象生成唯一的散列码
ZJ 21:18:34
那若是散列码重复了呢?
付老实 21:19:59
所以在java的集合中,判断两个对象是否相等的规则是:
1,判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2
2,判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
完毕
- 关于hibernate中实体中equals和hashcode方法的重写
- hibernate实体类中为何要重写equals与hashcode方法
- hibernate实体类中为何要重写equals与hashcode方法
- HashMap中重写hashCode和equals方法
- java中重写equals和hashCode方法
- Java中equals和hashcode方法重写
- 【JAVA】hibernate实体中equals、hashCode和==
- Hibernate实体hashcode和equals方法
- hibernate中联合主键重写equals和hashCode
- 为什么要重写java中对象的equals方法和hashCode方法以及如何重写
- hibernate中联合主键要同时重写hashCode()和equals()方法
- Hibernate中为什么要重写equals()和hashCode()这两个方法
- Java中HashSet要重写equals方法和hashCode方法
- 关于重写entity的equals()和hashCode()方法的必要性
- hashset中equals和hashcode方法重写问题
- IDEA中快捷为类重写equals和hashCode方法
- 关于hashcode和equals方法重写的一些理解!
- 实体类自动重写toString(),equals()和hashCode()方法
- myeclipse四大优化议案 myeclipse 10
- 第12次课堂作业
- sqlserver2005 单个用户更改为多用户
- razor
- 高手分享:快速处理IE如何打开网页的问题——认证系统
- 关于hibernate中实体中equals和hashcode方法的重写
- JavaScript中charAt函数
- 第四章 例4.1
- HQL查询中文乱码问题 (转)
- android 设备获取屏幕分辨率
- 使用 AJAX,局部刷新 GridView 进行数据绑定的简单实现
- Windows 系统错代码
- Oracle判断指定列是否全部为数字
- 微软安全新闻聚焦-双周刊第三十三期