Ich habe diese Frage zu lesen: Changing the elements in a set changes the 'equals' semanticsÄndern von Werten in HashSet
Aber ich weiß nicht, wie das Problem zu lösen, dass ich nicht ein Element in der HashSet ändern kann und es später entfernen.
Ich habe einige Beispiel Sourcecode:
public static void main(String[] args) {
TestClass testElement = new TestClass("1");
Set<TestClass> set = new HashSet<>();
set.add(testElement);
printIt(testElement, set, "First Set");
testElement.setS1("asdf");
printIt(testElement, set, "Set after changing value");
set.remove(testElement);
printIt(testElement, set, "Set after trying to remove value");
testElement.setS1("1");
printIt(testElement, set, "Set after changing value back");
set.remove(testElement);
printIt(testElement, set, "Set removing value");
}
private static void printIt(TestClass hullo, Set<TestClass> set, String message) {
System.out.println(message + " (hashCode is " + hullo.hashCode() + "):");
for (TestClass testClass : set) {
System.out.println(" " + testClass.toString());
System.out.println(" HashCode: " + testClass.hashCode());
System.out.println(" Element is equal: " + hullo.equals(testClass));
}
}
Wo Testclass ist nur ein POJO, die eine Variable (plus Getter & Setter) und hat hashcode() und equals() implementiert hält.
Es gab eine Anfrage, die equals() und hashcode() - Methoden zu zeigen. Diese werden automatisch generiert durch Verdunkelung:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((s1 == null) ? 0 : s1.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TestClass other = (TestClass) obj;
if (s1 == null) {
if (other.s1 != null)
return false;
} else if (!s1.equals(other.s1))
return false;
return true;
}
Das Ergebnis ist folgendes:
First Set (hashCode is 80):
TestClass [s1=1]
HashCode: 80
Element is equal: true
Set after changing value (hashCode is 3003475):
TestClass [s1=asdf]
HashCode: 3003475
Element is equal: true
Set after trying to remove value (hashCode is 3003475):
TestClass [s1=asdf]
HashCode: 3003475
Element is equal: true
Set after changing value back (hashCode is 80):
TestClass [s1=1]
HashCode: 80
Element is equal: true
Set removing value (hashCode is 80):
Wenn der Hash-Code geändert hat, kann ich nicht den Wert aus dem HashSet entfernen. Wie in der linked question, verstehe ich warum ist es so, aber ich weiß nicht, wie Sie einen geänderten Wert löschen. Gibt es eine Möglichkeit dazu?
Könnten Sie bitte den Hashcode posten? – mabbas
@ mabbas bearbeitet. – looper