gpt4 book ai didi

java - 哈希集允许重复?

转载 作者:搜寻专家 更新时间:2023-10-31 08:27:41 25 4
gpt4 key购买 nike

这个问题肯定不是新问题,但我在任何地方都找不到任何有用的答案。

正如您在下面的代码中看到的,equals 和 hashcode 方法被覆盖了,但它仍然允许重复。哈希码由 Netbeans 自动生成。

@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;
}

这是用于向哈希集中添加条目的代码:

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);

(allTask​​s 是哈希集)

此代码用于函数 A 和 B。

如果只执行功能 A,它工作正常。如果函数 B 在函数 A 之后执行(因此上面的代码执行了两次),那么哈希集会突然接受重复项,即使 system.err 被触发说存在重复项?

代码中是否存在缺陷,或者我只是遗漏了什么?

感谢您的帮助!

最佳答案

您正在使用 2 个字段将 2 个对象视为“相等”,但您正在使用 2 个以上的字段来构造哈希码。您的 hashCode() 方法不能比您的equals() 方法更具体。作为一个好的经验法则,您的 hashCode() 方法不应使用您的 equals() 方法不使用的任何字段(但是它可以使用更少)。更专业地说,如果 2 个对象“相等”,它们必须具有相同的哈希码(不需要反过来)。

关于java - 哈希集允许重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13803743/

25 4 0
文章推荐: swift - swift playground 中单表达式闭包的隐式返回
文章推荐: javascript - 带有背景图片的自定义形状
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com