我正在覆盖简单容器对象的equals和hashcode方法,用于两个整数。每个整数反映另一个对象的索引(该对象是什么并不重要)。该类的目的是表示两个对象之间的连接。
连接的方向无关紧要,因此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方法时会产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
如果有人知道减少匹配哈希码数量的简单方法,我将感激不尽。
谢谢!
Tim
PS 我知道java.sql.Connection会导致一些导入的麻烦。 实际上,在我的应用程序中,该对象具有更具体的名称,但为了简洁起见,我在此处将其缩短为Connection。
bigprime1*(from+to)-bigprime2*min(from,to)
。无需计算最大值和最小值,因为 sum-max=min。在哈希中,XOR似乎很受欢迎,但在具有定义溢出语义的语言中,我不知道它是否比加法具有任何有意义的优势。 - supercat