में मैं इस सवाल पढ़ा है: Changing the elements in a set changes the 'equals' semanticsबदलने मूल्यों HashSet
हालांकि, मैं कैसे समस्या यह है कि मैं HashSet में एक आइटम को बदल नहीं सकते और इसे बाद में हटा दें हल करने के लिए पता नहीं है।
मैं कुछ उदाहरण 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));
}
}
कहाँ TestClass सिर्फ एक POJO कि एक चर (प्लस गेटर & सेटर) रखती है और hashCode() और बराबरी() लागू किया है।
बराबर() और हैशकोड() - विधियों को दिखाने का अनुरोध था। ये ग्रहण द्वारा स्वतः जेनरेट कर रहे हैं:
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):
जब hashCode बदल गया है, मैं HashSet से मान निकालें नहीं कर सकते हैं:
@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;
}
परिणाम निम्न है। linked question में, मैं क्यों समझता हूं ऐसा क्यों है, लेकिन मुझे नहीं पता कि एक बदले गए मूल्य को कैसे हटाया जाए। क्या ऐसा करने की कोई संभावना है?
क्या आप हैशकोड पोस्ट कर सकते हैं और विधियों को बराबर कर सकते हैं? – mabbas
@mabbas संपादित। – looper