我正在为两个整数的简单容器对象覆盖 equals 和 hashcode 方法。每个 int 都反映了另一个对象的索引(无论该对象是什么)。类的重点是表示两个对象之间的连接。
连接的方向无关紧要,因此无论两个整数在对象中的哪个方向,equals 方法都应该返回 true。
connectionA = new Connection(1,2);
connectionB = new Connection(1,3);
connectionC = new Connection(2,1);
connectionA.equals(connectionB); // returns false
connectionA.equals(connectionC); // returns true
这是我所拥有的(从 Integer 的源代码修改):
public class Connection {
// Simple container for two numbers which are connected.
// Two Connection objects are equal regardless of the order of from and to.
int from;
int to;
public Connection(int from, int to) {
this.from = from;
this.to = to;
}
// Modifed from Integer source code
@Override
public boolean equals(Object obj) {
if (obj instanceof Connection) {
Connection connectionObj = (Connection) obj;
return ((from == connectionObj.from && to == connectionObj.to) || (from == connectionObj.to && to == connectionObj.from));
}
return false;
}
@Override
public int hashCode() {
return from*to;
}
}
这确实有效,但我的问题是:有没有更好的方法来实现这一目标?
我主要担心的是 hashcode() 方法将为任何两个乘以等于相同数字的整数返回相同的哈希码。例如
3*4 = 12
2*6 = 12 // same!
文档http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#hashCode()指出
如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
如果有人能看到一种减少匹配哈希码数量的简单方法,那么我将不胜感激。
谢谢!
蒂姆
PS 我知道有一个 java.sql.Connection 可能会导致一些导入烦恼。该对象实际上在我的应用程序中具有更具体的名称,但为简洁起见,我在此处将其缩短为 Connection。