这个问题肯定不是一个新问题,但我没有在任何地方找到有用的答案。如你在下面的代码中看到的,equals和hashcode方法被覆盖,但它仍然允许重复。哈希码由Netbeans自动生成。Hashset允许重复?
@Override
public boolean equals(Object o)
{
TaskDetails other = (TaskDetails) o;
if ((id_subtask == other.id_subtask)
&& ((date.compareTo(other.date)) == 0))
{
System.err.println("Duplicate Entry"+id_subtask+" + "+other.id_subtask);
return true;
}
else
{
System.out.println("Good!" +id_subtask+" + "+other.id_subtask);
return false;
}
}
@Override
public int hashCode() {
int hash = 7;
hash = 71 * hash + this.id_subtask;
hash = 71 * hash + this.id_team_member;
hash = 71 * hash + Float.floatToIntBits(this.nb_hours);
hash = 71 * hash + (this.date != null ? this.date.hashCode() : 0);
hash = 71 * hash + (this.comment != null ? this.comment.hashCode() : 0);
hash = 71 * hash + (this.subtask_name != null ? this.subtask_name.hashCode() : 0);
System.out.println("Hash : "+hash + "Subtask : " + id_subtask);
return hash;
}
这
用于添加进入HashSet的代码:
TaskDetails newTaskDetails = new TaskDetails
(
s.getId_subtask(),
mus.teamMember.getId_team_member(),
f,
mysqlFormat.format(caldate),
c.substring(0, Math.min(c.length(), 100)),
s.getName_subtask()
);
allTasks.add(newTaskDetails);
(allTasks作为的Hashset)
该代码在功能A中使用和B.
如果只执行功能A,则它工作正常。如果在函数A之后执行函数B(所以上面的代码被执行了两次),那么即使system.err被触发说有重复项,哈希集合突然接受重复项?
代码中是否存在缺陷,或者我只是错过了一些东西?
感谢您的帮助!
我怀疑某些操作newTaskDetails由于其中的哈希值正在改变。 – kosa
你是否在重写这些方法? –
你的意思是“接受重复”吗?整个对象是一样的,还是你的意思是重复ID? – Zutty