gpt4 book ai didi

java - 如何更正 hashCode() 方法以正确使用 HashSet 集合

转载 作者:行者123 更新时间:2023-11-30 06:46:17 28 4
gpt4 key购买 nike

为了确保我们的 equals 和 hashcode() 得到很好的实现,我们必须确保以下规则

  • 反身性
  • 对称
  • 传递性
  • 一致性
  • 非无效

但是我的以下实现违反了规则一致性(如果我修改它的字段,x 将永远不会等于它自己)那么我必须做些什么才能使这个测试正确运行?

public class TestHashCode {

public class Point {

public int x;
public int y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}

public int hashCode() {
int hash = 3;
hash = 97 * hash + this.x;
hash = 97 * hash + this.y;
return hash;
}

public boolean equals(Object obj) {
// generated code by netbeans IDE
}

}

@Test
public void testEquals() {
Point x = new Point(1, 1);
Set<Point> pointsAsSet = new HashSet<>();
pointsAsSet.add(x);
x.x = 3 ;
Assert.assertTrue(pointsAsSet.contains(x));
}

最佳答案

您不能改变 HashSet 成员的属性(参与 equalshashCode 的实现)并期望它起作用。

要么不改变这些属性,要么从 HashSet 中删除元素在你改变它之前,稍后重新添加它:

Point x = new Point(1, 1);
Set<Point> pointsAsSet = new HashSet<>();
pointsAsSet.add(x);
...
pointsAsSet.remove(x);
x.x = 3 ;
pointsAsSet.add(x);
...
Assert.assertTrue(pointsAsSet.contains(x));

作为替代方案,如果您在 Point 中有一些独特的不可变属性类,您可以将其用作 HashMap 中的键(例如 HashMap<Integer,Point> ),然后您将不需要 Point要覆盖的类 equalshashCode .

关于java - 如何更正 hashCode() 方法以正确使用 HashSet 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47811941/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com