रूप Abimaran Kugathasan बताया गया है, HashMap कार्यान्वयन का उपयोग करता हैश बाल्टी कुशलता कुंजी को देखने के लिए, और केवल बराबरी का उपयोग करता है() मिलान हैश बाल्टी में चाबियाँ तुलना करने के लिए दी गई कुंजी के खिलाफ। यह ध्यान देने योग्य है कि कुंजी हैश-बाल्टी को सौंपी जाती है जब उन्हें हैश मैप में जोड़ा जाता है। यदि आप उन्हें जोड़ने के बाद हैश मैप में कुंजियों को बदलते हैं, तो वे अपने हैश कोड को बदल देंगे, तो वे उचित हैश-बाल्टी में नहीं होंगे; और मानचित्र तक पहुंचने के लिए मिलान करने वाली कुंजी का उपयोग करने का प्रयास उचित हैश-बाल्टी पाएगा, लेकिन इसमें परिवर्तित कुंजी नहीं होगी।
class aMutableType {
private int value;
public aMutableType(int originalValue) {
this.value = originalValue;
}
public int getValue() {
return this.value;
}
public void setValue(int newValue) {
this.value = newValue;
}
@Override
public boolean equals(Object o) {
// ... all the normal tests ...
return this.value == ((aMutableType) o).value;
}
@Override
public int hashCode() {
return Integer.hashCode(this.value);
}
}
...
Map<aMutableType, Integer> aMap = new HashMap<>();
aMap.put(new aMutableType(5), 3); // puts key in bucket for hash(5)
for (aMutableType key : new HashSet<>(aMap.keySet()))
key.setValue(key.getValue()+1); // key 5 => 6
if (aMap.containsKey(new aMutableType(6))
doSomething(); // won't get here, even though
// there's a key == 6 in the Map,
// because that key is in the hash-bucket for 5
यह कुछ बहुत अजीब दिखने व्यवहार हो सकता है। आपMap.containsKey (theKey) से पहले एक ब्रेकपॉइंट सेट कर सकते हैं, और देख सकते हैं कि केई का मान मैप में एक कुंजी से मेल खाता है, और फिर भी कुंजी के बराबर() को नहीं कहा जाएगा, और इसमें शामिल है() झूठी वापसी करेगा।
के रूप में यहाँ https://stackoverflow.com/a/21601013 बताया गया है, वास्तव में चाबी के लिए परिवर्तनशील प्रकार के उपयोग के संबंध मानचित्र के लिए एक चेतावनी JavaDoc। गैर-हैश मानचित्र प्रकारों में यह विशेष समस्या नहीं होगी, लेकिन जब कुंजी को जगह में बदल दिया जाता है तो अन्य समस्याएं हो सकती हैं।
स्रोत
2016-12-07 04:36:09
अधिक विशेष रूप से, यदि आप 'बराबर' विधि को लागू करते हैं, तो आपको मैन्युअल में लिखे गए 'हैशकोड' को लागू करना चाहिए :) –
मुझे ग्रहण में विज़ार्ड का उपयोग करने का एक आसान तरीका मिल गया है, बस स्रोत चला रहा है | हैशकोड() और बराबर() उत्पन्न करें। –