以前在学校学习过哈希算法,但一直对JAVA中的hashCode()方法以及其做法不甚了解.今天上网查了下,发现原来JAVA中的非重复集合都是散列存储的.在判断是否重复方面,哈希算法有其天然优势——相对equals()来说~
equals()和hashcode()这两个方法都是从object类中继承过来的。
equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
既比较其引用值是否相等。但是在封装类中是被重写的,这些早就知道就不说了。
但是当自己写个新TYPE时,如果要重写equals() , then we shall noting the following tips which I found on the www:
• 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
• 反射性:x.equals(x)必须返回是“true”。
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
• 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
以上这五点是重写equals()方法时,必须遵守的准则,如果违反会出现意想不到的结果。
hasCode() 在Objectr的API中定义如下:
public native int hashCode();
但以后的包装类中都覆盖了该方法,但基本的原则是:
equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。这个现象很明显是由于散列算法本身的散列值冲突决定的。