使用List的一部分进行比较时自定义hashCode

时间:2014-08-15 07:43:05

标签: java equals hashcode

我正在尝试编写自定义hashCode fn,但我无法找到正确的方法。

public class Person {
    String name;
    List<String> attributes;

    @Override 
    public boolean equals(Object o) {
        // Persons are equal if name is equal & if >= 2 of attributes are equal
        // This I have implemented
    }

    @Override 
    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        result = (result*PRIME) + (this.name == null ? 0 : this.name.hashCode());

        //Not sure what to do here to account for attributes            

        return result;
    }
}

我希望hashCode fn是这样的:
“如果object1和object2根据equals()方法相等,它们也必须具有相同的哈希码”

不确定该怎么做?

2 个答案:

答案 0 :(得分:3)

作为Oli points out in the comments,您无法通过实施equals()并依靠Set为您重复删除来解决此问题。可能会发生奇怪的事情。

因此,你必须自己编码。将列表中的第一项添加到新的重复数据删除列表中。然后,对于原始列表中的每个剩余项目,将其与重复数据删除列表中已存在的项目进行比较,并且只有在通过非重复测试时才添加它。

答案 1 :(得分:-1)

完成equals / hashcCode方法的契约的最简单方法是返回一个常量:     @覆盖     public int hashCode(){return 13;}

否则,只使用基于名称的哈希码的解决方案才有效。