hashCode()
协定允许不同的对象具有相同的哈希代码。从文档中:
如果根据equals(java.lang.Object( 方法,两个对象不相等,则对两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果,
则不需要。
同时,在 Eclipse 中,如果使用函数 Source->Generate hashCode(( 和 equals,你会得到这样的东西:
package test1;
public class j1 {
private int a;
private int b;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + b;
return result;
}
@Override
public boolean equals(Object obj) {
//compare hashcode
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
j1 other = (j1) obj;
if (a != other.a)
return false;
if (b != other.b)
return false;
return true;
}
}
在函数 equals(( 中,我们首先比较this
和obj
的哈希码,如果它们具有相同的哈希码,则 equals(( 返回 true。但该文件说,两个不同的对象可能有不同的哈希码,这将影响equals()
的正确性。我只是想不通这个问题。
在函数 equals(( 中,我们首先比较 this 和 obj 的哈希码,如果它们具有相同的哈希码,则 equals(( 返回 true。
不,if (this == obj)
不会比较两个对象的哈希代码。它检查this
和obj
是否引用相同的Object
,在这种情况下,它们也必须相等(因为任何Object
都应该等于自身(,因此在这种情况下不需要执行以下所有equals
逻辑。
另一方面,如果this != obj
,this
和obj
指的是不同的Object
s,但仍然可能彼此相等,这取决于equals
的逻辑。如果equals
的逻辑返回true
,合约要求它们必须具有相同的hashCode()
。
对this == obs
的调用不比较哈希代码。它比较对象的引用。基本上检查你是否像这样使用它
this.equals(this)
这是真的。