使用具有两个泛型字段的类覆盖hashCode

时间:2014-06-26 14:28:26

标签: java hashmap hashcode keyvaluepair

我正在实现一个类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方法,它确实为相等的对象提供相同的哈希码,为不同的对象提供不同的哈希码。一些提示?

3 个答案:

答案 0 :(得分:13)

不要重新发明轮子。

只需使用return Objects.hash(left, right);

即可

答案 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,则需要更多代码来处理它。