I read this question: Changing elements in a set changes the semantics of 'equals'
However, I do not know how to solve the problem, that I can not change the item in the HashSet and delete it later.
I have an example source code:
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)); } }
Where TestClass is just a POJO that contains a variable (plus getter and setter) and has hashcode () and equals ().
There was a request to show the equals () and hashcode () - methods. They are automatically generated by eclipse:
@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; }
The result is the following:
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):
When the hash code has changed, I cannot remove the value from the HashSet. As in the related question , I understand why this is so, but I do not know how to delete the changed value. Is there any way to do this?