给出以下等号的实现:
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方法的好方法
- 执行此检查—如果是则返回true。
- 做null检查——如果是则返回false。
- 执行instanceof检查
- 类型强制转换对象
- 从数字属性开始比较单个属性,因为比较数字属性比较快,并且使用短路运算符进行组合检查。如果第一个字段不匹配,不要尝试匹配属性的其余部分,并返回false。