hashCode和compareTo用于非标准等号



给出以下等号的实现:

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()方法用于确定两个对象是否相等。

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

反身性: Always, a = a。在Java中,a.s 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)也应为真。

你的equals()不符合这个规则。

此外,根据javadoc-强烈建议(尽管不是必需的)自然排序与等号一致。这是因为没有显式比较器的排序集(和排序映射)在与自然顺序与equals不一致的元素(或键)一起使用时表现得"奇怪"。因此,在对

进行自然排序时,使用equals()的实现可能会遇到一些问题

Java中重写equals方法的好方法

  1. 执行此检查—如果是则返回true。
  2. 做null检查——如果是则返回false。
  3. 执行instanceof检查
  4. 类型强制转换对象
  5. 从数字属性开始比较单个属性,因为比较数字属性比较快,并且使用短路运算符进行组合检查。如果第一个字段不匹配,不要尝试匹配属性的其余部分,并返回false。

最新更新