gpt4 book ai didi

java - 尽管同时实现了 hashCode() 和 equals(),但 HashSet 添加了重复条目

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:12:51 25 4
gpt4 key购买 nike

我有以下类(class):

class Point
{
double x, y;

// .... constructor and other functions here

public boolean equals(Point p)
{
if(p==null) return(false);
return(x==p.x && y==p.y);
}

public int hashCode()
{
int result=17;

long c1=Double.doubleToLongBits(x);
long c2=Double.doubleToLongBits(y);

int ci1=(int)(c1 ^ (c1 >>> 32));
int ci2=(int)(c2 ^ (c2 >>> 32));

result = 31 * result + ci1;
result = 31 * result + ci2;

return result;
}
}

现在,如果我编写以下代码:

    Point x=new Point(11,7);
Point y=new Point(11,7);

System.out.println("hash-code of x=" + x.hashCode());
System.out.println("hash-code of y=" + y.hashCode());
System.out.println("x.equals(y) = " + x.equals(y));
System.out.println("x==y = " + (x==y));

java.util.HashSet<Point> s=new java.util.HashSet<Point>();
s.add(x);
System.out.println("Contains "+y.toString()+" = "+s.contains(y));
s.add(y);
System.out.println("Set size: "+s.size());
java.util.Iterator<Point> itr=s.iterator();
while(itr.hasNext()) System.out.println(itr.next().toString());

我得到以下输出:

hash-code of x=79052753
hash-code of y=79052753
x.equals(y) = true
x==y = false
Contains (11.0,7.0) = false
Set size: 2
(11.0,7.0)
(11.0,7.0)

请帮助我理解为什么 contains() 返回 false(即使在 equals() 和 hashCode() 返回相同的值之后)以及我如何纠正这个问题(即防止 Java 添加重复元素)。提前致谢。

最佳答案

您已经更改了 Object.equals(Object) 的方法签名,因此您没有正确覆盖 equals。我建议您使用 @Override 注释来捕获此类错误。您的方法应该类似于,

@Override
public boolean equals(Object o)
{
if (this == o) {
return true;
}
if (o instanceof Point) {
Point p = (Point) o;
return(x==p.x && y==p.y);
}
return false;
}

关于java - 尽管同时实现了 hashCode() 和 equals(),但 HashSet 添加了重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36806863/

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