根据equals和hashcode

时间:2015-12-17 18:53:22

标签: java collections compare

与使用equals和hashcode相比,实现工具是否是一个坏主意(可能会有我忽略的后果)?我不关心元素的排序我只需要将排序确定为确定性。这当然是假设我的equals和hashcode是正确的。

这是我的compareTo看起来像

@Override
public int compareTo(DividendEvent other) {
    final int BEFORE = -1;
    final int EQUAL = 0;
    final int AFTER = 1;

    if(other == null){
        return BEFORE;
    }
    else if (this.equals(other)){
        return EQUAL;
    }
    else if (this.hashCode()>other.hashCode()){
        return AFTER;
    }
    else{
        return BEFORE;
    }
}

2 个答案:

答案 0 :(得分:2)

重要的是要避免"奇怪的事情"是遵守the contract of compareTo,即:

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  • (x.compareTo(y)>0 && y.compareTo(z)>0)隐含x.compareTo(z)>0
  • x.compareTo(y)==0表示所有sgn(x.compareTo(z)) == sgn(y.compareTo(z))
  • z

对于不相等但具有相同哈希码的对象,您的实现不会勾选第一个框。

您可以修改它:

else if (this.equals(other) || this.hashCode() == other.hashCode()){

勾选三个方框。然后你的实现将与equals不一致,但除此之外它看起来还不错。

假设您的hashCode对于给定对象是常量。

答案 1 :(得分:0)

有时框架要求你覆盖.equals()以便工作,(我在jsf + ejb中遇到过这种情况),并且这种类型的实现需要根据对象ID进行相等性检查。当你以这种方式实现compareTo时,你的逻辑是"比较"对象与此不同,这会导致混淆。

如果这些类是您的域对象而您没有在其他图层中使用它们,那么它可能没问题。我只是认为.equals方法以技术方式表示相等(例如相同的数据库ID),以及一些其他方法,如.identical(),您以业务逻辑方式实现。