我应该如何重写equals和hashcode方法以避免添加等于HashSet的对象?

时间:2016-01-12 06:57:14

标签: java

我已经研究了类似的例子并覆盖了这样的方法,但仍然被添加到具有相同名称但不同id的HashSet<NamedObject>个对象中。

public class NamedObject {
    String name;
    BigInteger id;

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        NamedObject that = (NamedObject) o;
        return this.name.equals(that.getName());
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }
}

1 个答案:

答案 0 :(得分:3)

  

我已经研究了类似的例子并覆盖了这样的方法,但仍然被添加到具有相同名称但不同id的HashSet<NamedObject>个对象中。

是的,因为您只在哈希码中使用id,并且只在相等性检查中使用nameHashSet<>只会在找到与您尝试添加的哈希码相同的哈希码的现有对象时调用equals() ...如果您的ID不同,则会高度equals哈希码不太可能不同,因此它永远不会使用具有相同名称的对象调用hashCode()

您的equals()hashCode()方法必须彼此保持一致。您需要确定相等性是基于名称,ID还是两者 - 然后在equals()hashCode中使用它。

来自Object.hashCode()文档:

  

hashCode的一般合约是:

     
      
  • 每当在执行Java应用程序期间多次在同一对象上调用它时,equals(Object)方法必须始终返回相同的整数,前提是不修改对象的等比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,此整数不需要保持一致。
  •   
  • 如果两个对象根据hashCode方法相等,则对两个对象中的每一个调用equals(java.lang.Object)方法必须生成相同的整数结果。
  •   
  • 如果两个对象根据hashCode方法不相等则不是必需的,那么在两个对象中的每一个上调用mongoose方法必须产生不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
  •   

您的方法目前打破了这些要求的中间阶段。