HashCodeBuilder和EqualsBuilder不起作用?

时间:2017-06-20 22:01:02

标签: java equals

我上课了。但是,当我创建一组具有相同私人成员价值的学生时,这些学生将被视为不同。我的设置应该过滤重复项,但不会。

class Student {
    private StudentType m_type;
    private List<Attribute> m_attributes;
    private DegreeType m_dType

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Student)) {
            return false;
        }

        Student st = (Student) o;
        EqualsBuilder eb = new EqualsBuilder()
            .append(m_type, st.m_type)
            .append(m_attributes, st.m_attributes)
            .append(m_dType, st.m_dType);
        return eb.isEquals();
    }

    @Override
    public int hashCode() {
        HashCodeBuilder hcb = new HashCodeBuilder()
            .append(m_type)
            .append(m_attributes)
            .append(m_dType);
        return hcb.toHashCode();
    }
}

注意:StudentType和DegreeType是枚举。我使用的是Java 8。

1 个答案:

答案 0 :(得分:0)

如果没有为equals()重载Attribute的值,您很可能使用Java中的默认List<Attribute>实现来比较.equals(),这样可以查看这两个对象是否占用记忆中的相同位置。

如果您实例化了Student的两个不同实例,那么两个实例中的List<Attribute>将永远不会相等,因为它们将是不同的列表 - 即使列表内部包含相同的确切值,甚至以相同的顺序。

EqualsBuilder并非完全神奇。它只是在你班级内的每个内部类型上调用.equals()

简而言之:它始终是.equals()。请务必为每种必要类型覆盖它。