Java 中有一个规定,就是两个相同(equals) 的对象,它们的hash code 也必须相同!在Object 类中有一个hashCode方法(int 类型的整数)。以MyObject类为例:
public class Prog
...{
public static void main(String argv[])...{
MyObject obj1=new MyObject(1);
MyObject obj2=new MyObject(1);
MyObject obj3=new MyObject(3);
System.out.println("obj1's hash code:"+obj1.hashCode());
System.out.println("obj2's hash code:"+obj2.hashCode());
System.out.println("obj3's hash code:"+obj3.hashCode());
}
}
程序执行结果为:
obj1's hash code:509639
obj2's hash code:746185
obj3's hash code:178753
可以看到三个MyObject 类的对象的hash code都不相同,尽管obj1,obj2是内容相同的(equals)。这样就违反了JAVA的规定,所以当改写equals方法时,也请一并改写haseCode方法。
hashCode方法的改写方式取得用于equals方法的属性wrapper类的hash code,然后返回它。如果有几个属性用于equals方法中的话,则将这几个属性的wrapper类的hash code做XOR运算后返回。这也是JAVA建议使用的方法。所以在MyObject 类中再加一个hashCode方法。
return (new Integer(data).hashCode());
}
修改完MyObject类后,再去执行上面的程序,结果为:
obj1's hash code:1
obj2's hash code:1
obj3's hash code:3