该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-02
五月天 写道 引用 equals()相等的两个对象,hashcode()一定相等; equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。 是这样吗?我做了个测试 class Product { private int id; private String name; public Product(int id, String name) { this.id = id; this.name = name; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (!(obj instanceof Product)) { return false; } Product other = (Product)obj; if (other.id != this.id) { return false; } return true; } } public class EqualsTest { public static void main(String[] args) { Product a = new Product(1, "zcl"); Product b = new Product(1, "chunlei"); System.out.println("equals: " + a.equals(b)); System.out.println("a.hashCode:" + a.hashCode()); System.out.println("b.hashCode:" + b.hashCode()); } } /** (output) D:\My Documents\javacode>javac EqualsTest.java D:\My Documents\javacode>java EqualsTest equals: true a.hashCode:12677476 b.hashCode:33263331 */ 是我理解错了还是楼主讲得有问题? 你都快土死了,你自己没有重写hashCode,当然不等。但这样是不对的。 你把这个对象放到hashMap里,看看能不能找到。 |
|
返回顶楼 | |
发表时间:2010-06-02
最后修改:2010-06-04
五月天 写道 引用 重写equal方法 一定要重写hashcode方法 也不一定吧?我觉得也只是在处理如HashMap,HashSet等通过哈希储存结构中会使用到hashCode。 当然,在重写equals方法时同时重写hashCode是个好的规范! 我刚才那代码只是想证明:equals方法判断对象相等时,hashCode不一定相等。 规定红灯不能闯,你说这不一定吧,我就是闯了,但我闯的时候四处看了看,很小心的过了马路,最后人没出事情。 然后你得出如下结论是:红灯不一定不闯。 |
|
返回顶楼 | |
发表时间:2010-06-02
ironsabre 写道 banfry 写道 五月天 写道 引用 重写equal方法 一定要重写hashcode方法 也不一定吧?我觉得也只是在处理如HashMap,HashSet等通过哈希储存结构中会使用到hashCode。 当然,在重写equals方法时同时重写hashCode是个好的规范! 我刚才那代码只是想证明:equals方法判断对象相等时,hashCode不一定相等。 对,只是一个规范而已,主要作用是提高对象存在HashMap,HashSet中的查找效率。其它地方用不到 不是查找效率的问题,是如果你equals相等而hashcode不相等时,你在hashMap里会找不到。不是效率问题,是对错问题。 先找hashcode,hashcode不等的,直接认为不等。相等的,再看equals,两者都等,才算等。 ![]() |
|
返回顶楼 | |
发表时间:2010-06-02
简单的来说hashCode方法的定义域是equals方法定义域的一个子集。
|
|
返回顶楼 | |
发表时间:2010-06-04
去看jdk docs 这个约定,你违反了约定出现错误没人管
|
|
返回顶楼 | |
发表时间:2010-06-07
一般来说,常量创建的HashCode是相等,用New往Heap里写是不等的~~
|
|
返回顶楼 | |
发表时间:2010-06-08
obsion 写道 一般来说,常量创建的HashCode是相等,用New往Heap里写是不等的~~
不懂能不能不乱讲? |
|
返回顶楼 | |
发表时间:2010-07-23
这是规范!如果这都怀疑,哪天程序出错了很难找到bug的出处。
例子:equals相等但是hashcode不等(即重写了equals不重写hashcode方法的坏处): Set<A> set = new HashSet<A>(); set.put(a1); set.put(a2); 如果a1.equals(a2)返回true,那么我们认为“a1和a2即为同一对象”,把它两放到set中去就只能存下一个对象,因为Set不允许重复的对象。Set存元素时使用对象的hashCode决定存储的位置,这样调用a1和a2的hashCode()方法时两个hashCode值不相等,存储的位置不一样,也就没了覆盖,这时候调用set.size()得到2,而不是1,出现错误。 |
|
返回顶楼 | |
发表时间:2010-07-23
够深的了 看完应该都明白了
虽然入门 但是不得不知 |
|
返回顶楼 | |
发表时间:2011-01-19
yongyuan.jiang 写道 这种浅析很没依据,测试代码也不足以说明观点。
文章苍白无力。 支持 |
|
返回顶楼 | |