मुझे लगता है कि मानक जावा हैश मैप में डुप्लिकेट कुंजी मिल रही है। "डुप्लिकेट" से, मेरा मतलब है कि चाबियाँ उनके equals()
विधि के बराबर होती हैं।मुझे जावा हैश मैप में डुप्लिकेट कुंजी क्यों मिल रही हैं?
import java.util.Map;
import java.util.HashMap;
public class User {
private String userId;
public User(String userId) {
this.userId = userId;
}
public boolean equals(User other) {
return userId.equals(other.getUserId());
}
public int hashCode() {
return userId.hashCode();
}
public String toString() {
return userId;
}
public static void main(String[] args) {
User arvo1 = new User("Arvo-Part");
User arvo2 = new User("Arvo-Part");
Map<User,Integer> map = new HashMap<User,Integer>();
map.put(arvo1,1);
map.put(arvo2,2);
System.out.println("arvo1.equals(arvo2): " + arvo1.equals(arvo2));
System.out.println("map: " + map.toString());
System.out.println("arvo1 hash: " + arvo1.hashCode());
System.out.println("arvo2 hash: " + arvo2.hashCode());
System.out.println("map.get(arvo1): " + map.get(arvo1));
System.out.println("map.get(arvo2): " + map.get(arvo2));
System.out.println("map.get(arvo2): " + map.get(arvo2));
System.out.println("map.get(arvo1): " + map.get(arvo1));
}
}
यहाँ और जिसके परिणामस्वरूप उत्पादन होता है:: यहाँ समस्याग्रस्त कोड है
arvo1.equals(arvo2): true
map: {Arvo-Part=1, Arvo-Part=2}
arvo1 hash: 164585782
arvo2 hash: 164585782
map.get(arvo1): 1
map.get(arvo2): 2
map.get(arvo2): 2
map.get(arvo1): 1
आप देख सकते हैं, दो User
वस्तुओं पर equals()
विधि true
लौटा रहा है और उनके हैश कोड एक ही हैं , फिर भी वे map
में एक अलग key
बनाते हैं। इसके अलावा, map
पिछले चार get()
कॉल में दो User
कुंजी के बीच अंतर करना जारी रखता है।
यह सीधे विपरीत है documentation:
अधिक औपचारिक रूप से, इस नक्शे को एक मूल्य v ऐसा है कि (कुंजी == बातिल कश्मीर == बातिल के लिए एक महत्वपूर्ण कश्मीर से एक मानचित्रण शामिल है: key.equals (के)), तो यह विधि v देता है; अन्यथा यह शून्य हो जाता है। (इस तरह के एक मैपिंग में हो सकता है।)
क्या यह एक बग है? क्या मुझसे कोई चूक हो रही है? मैं जावा संस्करण 1.8.0_92 चला रहा हूं, जिसे मैंने होमब्रू के माध्यम से स्थापित किया है।
संपादित करें: यह प्रश्न इस other question का डुप्लिकेट के रूप में चिह्नित किया गया है, लेकिन जबकि अन्य प्रश्न मान लिया गया त्रुटि hashCode()
के साथ निहित है मैं इस सवाल छोड़ देंगे के रूप में है, क्योंकि यह equals()
के साथ एक प्रतीयमान विसंगति पहचान करता है,। उम्मीद है कि इस प्रश्न की उपस्थिति इस मुद्दे को अधिक आसानी से खोजने योग्य बना देगी।
@ Override' अपने 'equals' को जोड़ने का प्रयास करें' और 'हैशकोड' विधियां (हमेशा एक सर्वोत्तम अभ्यास) और देखें कि क्या आपको कोई उपयोगी जानकारी मिलती है या नहीं। – chrylis
भविष्य में इस तरह के टाइपो, या गलतियों को अनुमति देने के लिए, हमेशा अपने आईडीई को आपके लिए विधियां उत्पन्न करने दें। फिर उन्हें अपनी तरह दिखने के लिए उन्हें ट्विक करें। इसने '@ ओवरराइड' एनोटेशन के साथ सही तरीके बनाए होंगे। – Magnilex