论坛首页 入门技术论坛

Java中== equals hashcode浅析

浏览 17193 次
该帖已经被评为新手帖
作者 正文
   发表时间: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里,看看能不能找到。
0 请登录后投票
   发表时间:2010-06-02   最后修改:2010-06-04
五月天 写道
引用

重写equal方法 一定要重写hashcode方法

也不一定吧?我觉得也只是在处理如HashMap,HashSet等通过哈希储存结构中会使用到hashCode。
当然,在重写equals方法时同时重写hashCode是个好的规范!
我刚才那代码只是想证明:equals方法判断对象相等时,hashCode不一定相等。


规定红灯不能闯,你说这不一定吧,我就是闯了,但我闯的时候四处看了看,很小心的过了马路,最后人没出事情。
然后你得出如下结论是:红灯不一定不闯。
0 请登录后投票
   发表时间:2010-06-02  
ironsabre 写道
banfry 写道
五月天 写道
引用

重写equal方法 一定要重写hashcode方法

也不一定吧?我觉得也只是在处理如HashMap,HashSet等通过哈希储存结构中会使用到hashCode。
当然,在重写equals方法时同时重写hashCode是个好的规范!
我刚才那代码只是想证明:equals方法判断对象相等时,hashCode不一定相等。

对,只是一个规范而已,主要作用是提高对象存在HashMap,HashSet中的查找效率。其它地方用不到


不是查找效率的问题,是如果你equals相等而hashcode不相等时,你在hashMap里会找不到。不是效率问题,是对错问题。

先找hashcode,hashcode不等的,直接认为不等。相等的,再看equals,两者都等,才算等。

0 请登录后投票
   发表时间:2010-06-02  
简单的来说hashCode方法的定义域是equals方法定义域的一个子集。
0 请登录后投票
   发表时间:2010-06-04  
去看jdk docs  这个约定,你违反了约定出现错误没人管
0 请登录后投票
   发表时间:2010-06-07  
一般来说,常量创建的HashCode是相等,用New往Heap里写是不等的~~
0 请登录后投票
   发表时间:2010-06-08  
obsion 写道
一般来说,常量创建的HashCode是相等,用New往Heap里写是不等的~~


不懂能不能不乱讲?
0 请登录后投票
   发表时间: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,出现错误。
0 请登录后投票
   发表时间:2010-07-23  
够深的了 看完应该都明白了
虽然入门 但是不得不知
0 请登录后投票
   发表时间:2011-01-19  
yongyuan.jiang 写道
这种浅析很没依据,测试代码也不足以说明观点。

文章苍白无力。

支持
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics