Hallo alle,
ich habe einen kleinen Test über HashSet gemacht, HashSet verhalten sich irgendwie sehr komisch. Könnt ihr mal erklären, warum ist das so?
ich füge ein Element "e1" in HashSet, danach verändere ich das Element "e1", dann findet HashSet das Element nicht mehr. Warum ist das so???
Hier ist der Konkrete Test:
Hier ist die Kante Klasse:
ich habe einen kleinen Test über HashSet gemacht, HashSet verhalten sich irgendwie sehr komisch. Könnt ihr mal erklären, warum ist das so?
ich füge ein Element "e1" in HashSet, danach verändere ich das Element "e1", dann findet HashSet das Element nicht mehr. Warum ist das so???
Hier ist der Konkrete Test:
Java:
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest {
public static void main(String[] args) {
HashSet<Kante> hs = new HashSet<Kante>();
Kante e1 = new Kante(1, 2);
hs.add(e1); // Füge e1 in hs ein
e1.setX(5); // Veränder e1, jetzt ist e1: (5, 2)
System.out.println(hs.contains(e1)); // Output: falsh!
// Hole ich das Element von hs aus, schau mal, was drin ist:
Iterator<Kante> it = hs.iterator();
Kante e2 = it.next();
System.out.println(e2.getX() + "," + e2.getY());// Output 5, 2
System.out.println(e2 == e1); // Output: true
System.out.println(hs.contains(e2)); // Komisch!!!! Hier finde diese hs die e2 nicht!!!
}
}
Hier ist die Kante Klasse:
Java:
public class Kante {
private int x = 0;
private int y = 0;
public Kante(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Kante other = (Kante) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
}
Zuletzt bearbeitet: