我上课了。但是,当我创建一组具有相同私人成员价值的学生时,这些学生将被视为不同。我的设置应该过滤重复项,但不会。
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。
答案 0 :(得分:0)
如果没有为equals()
重载Attribute
的值,您很可能使用Java中的默认List<Attribute>
实现来比较.equals()
,这样可以查看这两个对象是否占用记忆中的相同位置。
如果您实例化了Student
的两个不同实例,那么两个实例中的List<Attribute>
将永远不会相等,因为它们将是不同的列表 - 即使列表内部包含相同的确切值,甚至以相同的顺序。
EqualsBuilder
并非完全神奇。它只是在你班级内的每个内部类型上调用.equals()
。
简而言之:它始终是.equals()
。请务必为每种必要类型覆盖它。