Ich habe die folgende Klasse:HashSet fügt doppelte Einträge trotz sowohl hashCode Umsetzung() und equals()
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;
}
}
Nun, wenn ich schreibe den folgenden Code:
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());
Ich erhalte die folgende Ausgabe:
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)
Bitte helfen Sie mir zu verstehen, warum enthält() gibt false (auch nach equals() und hashCode() den gleichen Wert zurückgeben) und wie kann ich dies korrigieren (d. h. Verhindern, dass Java doppelte Elemente hinzufügt). Danke im Voraus.
Wow! Es wäre so toll, wenn alle Fragen so klar und verständlich sind, und Code und Ausgaben für die Wiedergabe haben. Gut gemacht! – Seelenvirtuose