我正在实现一个类Pair
,将其用作具有HashMap
的两个值的键。我使用泛型来保持字段的类型变量。我设法写了代码的最大部分:
public class Pair<L, R>
{
private L left;
private R right;
Pair(L left, R right)
{
this.left = left;
this.right = right;
}
public L getLeft()
{
return left;
}
public R getRight()
{
return right;
}
public void setLeft(L left)
{
this.left = left;
}
public void setRight(R right)
{
this.right = right;
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof Pair< ? , ? >)
{
Pair< ? , ? > pair = (Pair< ? , ? >)obj;
return left.equals(pair.getLeft()) && right.equals(pair.getRight());
}
return false;
}
@Override
public String toString()
{
return "Pair " + Integer.toHexString(hashCode()) + ": (" + left.toString() + ", " + right.toString()
+ ")";
}
}
我的问题是创建正确的hashCode
方法,它确实为相等的对象提供相同的哈希码,为不同的对象提供不同的哈希码。一些提示?
答案 0 :(得分:13)
不要重新发明轮子。
即可答案 1 :(得分:1)
您已经依赖左右equals
方法了,为什么不依赖他们的hashcodes
?
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + (left ==null? 0 : left.hashCode());
result = prime * result + (right ==null? 0 : right.hashCode());
return result;
}
答案 2 :(得分:0)
这应该可以解决问题(当然哈希码永远不会保证不同)
@Override
public int hashCode() {
return (left.hashCode()+"/"+right.hashCode()).hashCode();
}
如果left或right可以为null,则需要更多代码来处理它。