hashCode和compareTo表示非标准等号

时间:2014-06-23 17:20:30

标签: java

鉴于以下实现等于:

public class Test implements Comparable<Test> {
    private int x, y;

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Test) {
            Test other = (Test) obj;
            return x == other.x || y == other.y;
        }
        return false;
    }

    @Override
    public int hashCode() {
        //implementation?
    }

    @Override
    public int compareTo(Test o) {
        //implementation?
    }
}

hashCode和compareTo的正确/最佳性能实现是什么? 请注意 - equals使用 OR ,而非 AND

1 个答案:

答案 0 :(得分:4)

equals()方法用于确定两个对象的相等性。

当我们说平等时,它应该遵循以下属性,

反身:总是,a = a。在Java中,a.equals(a)应该始终为真。

对称:如果a = b,则b = a。在Java中,如果a.equals(b)为真,则b.equals(a)应该为真。

传递性:如果a = b且b = c,则a = c。在Java中,如果a.equals(b)和b.equals(c)为真,则a.equals(c)应该为真。

你的等于()并不违反这条规则。

此外根据 javadoc - 强烈建议(尽管不要求)自然排序与equals一致。这是因为没有显式比较器的有序集(和有序映射)表现得很奇怪&#34;当它们与自然排序与equals 不一致的元素(或键)一起使用时。因此,在自然排序

的同时,使用equals()的实现可能会遇到一些问题

在Java中重写equals方法的好方法

  1. 执行此检查 - 如果是,则返回true。
  2. 执行空检查 - 如果是,则返回false。
  3. 执行instanceof check
  4. 输入对象
  5. 比较从数字属性开始的单个属性,因为比较数字属性是快速的并且使用短路运算符来组合检查。如果第一个字段不匹配,请不要尝试匹配其余属性并返回false。