当集合包含元素时,java set.contains()给出false?

当集合包含元素时,java set.contains()给出false?,java,set,equality,Java,Set,Equality,请参阅下面的junit测试代码段。帐户有一组分配。当包含的城市名称等于'Bladel'时,我想从赋值中删除一个元素 Assignment toBeDeleted = null; for (Assignment ass : account.getAssignments()) { if (ass.getCity().getName().equals("Bladel")) { toBeDeleted = ass; break; } } Assert.as

请参阅下面的junit测试代码段。帐户有一组分配。当包含的城市名称等于'Bladel'时,我想从赋值中删除一个元素

Assignment toBeDeleted = null;
for (Assignment ass : account.getAssignments()) {
    if (ass.getCity().getName().equals("Bladel")) {
        toBeDeleted = ass;
        break;
    }
}
Assert.assertNotNull(toBeDeleted);
for (Assignment ass : account.getAssignments()) {
    logger.info(String.format("hash [%s] %d with [%s] %d",toBeDeleted.getCity().getName(), toBeDeleted.hashCode(), ass.getCity().getName(), ass.hashCode()));
    if (ass.equals(toBeDeleted)) {logger.info("found equal assignment"); }
    if (ass.hashCode() == toBeDeleted.hashCode()) {logger.info("found equal hash assignment"); }
    if (ass == toBeDeleted) { logger.info("it is == with"); }
}
Assert.assertTrue(account.getAssignments().contains(toBeDeleted));
但是失败了,所以我将
.remove()
替换为
.contains()
仍然失败。日志明确显示toBeDeleted在某个点上等于集合中的一个元素:

2014-02-27 22:33:35 INFO  AssignmentDAOTest:134 - found equal assignment
2014-02-27 22:33:35 INFO  Assignment:66 - for assignment + Bladel result is 2121952
2014-02-27 22:33:35 INFO  Assignment:66 - for assignment + Bladel result is 2121952
2014-02-27 22:33:35 INFO  AssignmentDAOTest:135 - found equal hash assignment
2014-02-27 22:33:35 INFO  AssignmentDAOTest:136 - it is == with
出什么事了?我认为
remove()
contains()
equals()
返回true时匹配

根据评论: Account是Hibernate映射的java类,集合的填充在Hibernate左侧的unittest中

public class Account {
    ....
@OneToMany(mappedBy="account", fetch=FetchType.LAZY, cascade={CascadeType.ALL})
public Set<Assignment> getAssignments() {return assignments;}
public void setAssignments(Set<Assignment> asgmnts) {
    logger.info("setting assignments");
    assignments = asgmnts;
}
公共类帐户{
....
@OneToMany(mappedBy=“account”,fetch=FetchType.LAZY,cascade={CascadeType.ALL})
公共集getAssignments(){return assignments;}
公共无效集合分配(集合为空){
logger.info(“设置分配”);
分配=asgmnts;
}

如果使用树集存储分配,则需要重写分配类中的compareTo()方法,或提供自定义比较器来比较分配对象

以下是来自javadoc的文本:

请注意,如果要正确实现set接口,集合维护的顺序(无论是否提供显式比较器)必须与equals一致。(有关与equals一致的精确定义,请参阅Comparable or comparator。)这是因为Set接口是根据equals操作定义的,但是TreeSet实例使用其compareTo(或compare)执行所有元素的比较方法,因此,从集合的角度来看,被该方法视为相等的两个元素是相等的。集合的行为是明确定义的,即使其顺序与相等不一致;它只是未能遵守集合接口的一般契约


你能展示你的
作业
类吗?你使用的是树集吗?什么类型的
帐户。getAssignments()
?集合来自Hibernate@oneToMany。我会更新question@ZouZou那也是真的!!