覆盖自定义类的哈希码和等号

时间:2016-06-26 12:13:58

标签: java equals override

我创建了一个包含2个字段的类。一个Double和一个Line2D。我想覆盖equals方法,以便下面的代码返回true

public class Main {

    public static void main(String[] args) {
        StatusLinePair slp1 = new StatusLinePair(25.0, new Line2D.Double(123.0, 32.0, 342.0, 54.0));  
        StatusLinePair slp2 = new StatusLinePair(25.0, new Line2D.Double(123.0, 32.0, 342.0, 54.0));

        System.out.println(slp1.equals(slp2));
    }

}

这是我尝试的但是我仍然没有得到预期的结果

public class StatusLinePair {
    public Double yAxisOrder;
    public Line2D line;

    public StatusLinePair(Double yAxisOrder, Line2D line) {
        this.yAxisOrder = yAxisOrder;
        this.line = line;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((line == null) ? 0 : line.hashCode());
        result = prime * result + ((yAxisOrder == null) ? 0 : yAxisOrder.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        StatusLinePair other = (StatusLinePair) obj;

        if (this.yAxisOrder == other.yAxisOrder && this.line.getX1() == other.line.getX1()
                && this.line.getX2() == other.line.getX2() && this.line.getY1() == other.line.getY1()
                && this.line.getY2() == other.line.getY2())
            return true;        

        return false;
    }
}

请帮帮我。提前谢谢!

4 个答案:

答案 0 :(得分:3)

您的代码存在一些问题:

  • 如果另一个对象不是StatusLinePair,它应该返回false,而不是抛出ClassCastException
  • 如果另一个对象为null,则应返回false,而不是抛出NullPointerException
  • 它不应该将Double个实例与==进行比较,而应该与equals()进行比较(或者类应该包含double而不是Double,因为它似乎不可为空):这就是你的具体问题的原因。
  • 不应使用Line2D.hashCode(),因为它不使用Line2D.equals()

答案 1 :(得分:2)

您没有使用Line2D.equals,因此我认为这不是以您需要的方式实现,或者您将使用它。如果是这种情况,则不应使用Line2D.hashCode()。

简而言之,要么使用Line2D.hashCode()和Line2D.equals(),要么不使用混合。

答案 2 :(得分:2)

使用== 您没有比较对象的实际值,而是比较参考值。

For example:
     Object a = new Object();
     Object b = a;              // if you compare these two objects with == it will return true

But
    Object a =new Object();
    Object b = new Object();    // if you compare these two objects with == then it will return false as they are pointing to two different objects

通过覆盖 equals(),您可以根据其值比较两个对象。 check this link out for more on equals

我希望这会有所帮助。 THANKYOU

答案 3 :(得分:-1)

看这里:

重载等于()和运算符的指南==: https://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

AND

重载GetHashCode指南: https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.80).aspx

它在C#中,但几乎是一样的!