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只是技术要求(为了提高效率)
付老实 21:09:02
2,为什么要重写equals呢,因为在java的集合框架中,是通过equals来判断两个对象是否相等的
付老实 21:10:03
3,在hibernate中,经常使用set集合来保存相关对象,而set集合是不允许重复的,但是下面的程序,你判断一下运行结果
付老实 21:10:44
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运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
完毕
Neo 21:19:52
String好像是一个特例阿。。。
付老实 21:20:59
由此可以看出,一个好的散列码算法可以加快程序的速度,apache专门有个工具可以为类生成hashCode,MyEclipse 5.0中也有一个工具
付老实 21:21:09
String没有什么特殊的,也是这个原则
Neo 21:21:39
那"123","123"这两个字符串为什么相等?
付老实 21:23:00
晕,你说呢
Neo 21:22:07
。。。
Neo 21:22:10
想起来了
Neo 21:22:19
池是把?
付老实 21:23:20
嗯
Neo 21:22:36
云,忘了~
付老实 21:23:49
好了,下去再去看看《深入浅出Hibernate》的210页吧
本文转至:http://hi.baidu.com/fgfd0/blog/item/99569f136da496856438db43.html
ps:Esclisp自动生成equals/hashCode工具 Commonclipse (http://commonclipse.sf.net)
分享到:
相关推荐
重写equals和hashcode方法,学习和进步
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
关于重写equals,hashcode以及compareTo方法!
文章目录1、hashCode与equals两者之间的关系2、== 和equals的区别`3、为什么要重写equals()方法?4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: ...
个人学习终结成果:为什么要重新equals和hashCode方法?如何重写?站好马步需从j2se基础开始
为什么重写equals方法,还必须要重写hashcode方法
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
主要介绍了Java重写equals及hashcode方法流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
本文讲述了什么时候重写equals方法和如何重写equals方法。
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
面试官问我,为什么重写equals函数,必须重写hashCode函数,我当时就懵住了。 然后扯天扯地,然后面试官瞬间就饱了,痛定思痛,写下这篇博客 首先看String的equals源码 String重写了equals方法,引用指向同一个地址...
Object 类是所有类的父类,其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。他们都是通过比较地址来比较对象是否相等的
1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子
主要给大家介绍了关于java中为什么重写equals时必须重写hashCode方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
下面小编就为大家带来一篇java中重写equals()方法的同时要重写hashcode()方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://alpha2009.iteye.com/blog/570322
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法