अगर दो ऑब्जेक्ट equals के हिसाब से बराबर हैं, तो उनका hashCode भी एक ही होना चाहिए; असमान ऑब्जेक्ट एक ही hash साझा कर सकते हैं, पर आदर्श रूप से नहीं करते। यह नियम तोड़िए और hash आधारित collections बिगड़ जाती हैं: HashMap में डाला गया ऑब्जेक्ट पहुंच से बाहर हो जाता है क्योंकि lookup किसी और bucket में जाता है। equals का reflexive, symmetric, transitive और consistent होना भी जरूरी है, और insert के बाद hash में इस्तेमाल हुई किसी field को बदल देना भी entry को उतने ही अच्छे से गुम कर देता है।
इंटरव्यूअर यह क्यों पूछते हैं
यह बुनियाद जांचने वाला सवाल है जो असली बग्स की भविष्यवाणी करता है, खासकर उन codebases में जहां entities को map keys या sets में इस्तेमाल किया जाता है। इंटरव्यूअर चाहते हैं कि आप इसे एकतरफा implication की तरह ठीक से कहें, साथ में व्यावहारिक नाकामी भी: एक ऐसा set जिसमें आइटम मौजूद है पर मिलता नहीं। फॉलो अप आमतौर पर JPA entities की ओर जाते हैं, जहां generated id पर equals लिखना क्लासिक जाल है, और records की ओर, जो दोनों आपके लिए बना देते हैं।
अपना जवाब कैसे स्ट्रक्चर करें
- contract को implication की तरह बताएं, equivalence की तरह नहीं।
- HashMap या HashSet में होने वाली ठोस नाकामी बताएं।
- hash में इस्तेमाल होने वाली fields की mutability का जिक्र करें।
- बताएं कि आप व्यवहार में क्या करते हैं: records, या कोई स्थिर business key।
उदाहरण जवाब
नियम एकतरफा है: बराबर ऑब्जेक्ट्स के hash codes बराबर होने ही चाहिए, पर बराबर hash codes का मतलब बराबरी नहीं है, इसीलिए map bucket के अंदर फिर भी equals कॉल करता है। अगर मैं equals override करूं और hashCode भूल जाऊं, तो दो बराबर ऑब्जेक्ट अलग अलग buckets में जा गिरते हैं, यानी मैं कुछ HashSet में डाल सकता हूं और फिर एक बिल्कुल वैसे ही ऑब्जेक्ट पर contains false लौटा देगा। इसका ज्यादा बारीक रूप mutation है। अगर hash में इस्तेमाल हुई कोई field ऑब्जेक्ट के set में जाने के बाद बदल जाए, तो entry अब गलत bucket में है और असल में खो चुकी है, और यह leak की तरह दिखता है क्योंकि उसे हटाया भी नहीं जा सकता। व्यवहार में मैं value types के लिए records इस्तेमाल करता हूं ताकि दोनों अपने आप बनें और आपस में मेल खाएं। JPA entities में मैं सावधान रहता हूं, क्योंकि generated id इस्तेमाल करने का मतलब है कि entity के persist होते ही equals बदल जाता है, तो flush से पहले HashSet में पड़ी entity बाद में अलग बर्ताव करती है। जहां कोई स्थिर natural या business key हो वहां मैं वही लेता हूं, और वरना बिना सेव हुई entities को hash आधारित collections में डालने से बचता हूं।
जल्दी ही यह इंटरव्यू देने जा रहे हैं? GhostPilot आपकी लाइव कॉल सुनता है, सवाल पूछे जाते ही उसे पकड़ लेता है, और रियल-टाइम में एक स्ट्रक्चर्ड जवाब आपकी स्क्रीन पर डाल देता है। अगले मॉक में इसे आजमाएं, या ले लें एक $29 Session Pass, कोई सब्सक्रिप्शन नहीं, असली इंटरव्यू के लिए।
देखें यह कैसे काम करता हैफॉलो-अप सवाल जिनकी उम्मीद रखें
- generated id वाली JPA entity के लिए आप equals कैसे लिखेंगे?
- record आपके लिए क्या क्या बना देता है, और कब वह आपकी जरूरत के हिसाब से ठीक नहीं होता?
- खराब hash function सही होते हुए भी HashMap को क्यों धीमा कर देता है?
Java डेवलपर के और सवाल
आपका इंटरव्यूअर इसका अपना वर्ज़न पूछेगा। फ्री Question Predictor में अपना असली जॉब डिस्क्रिप्शन पेस्ट कीजिए और वो 20 सवाल पाइए जो उस रोल में सबसे ज्यादा पूछे जाने की संभावना है, साथ में यह भी कि हर सवाल असल में क्या टटोल रहा है।
मेरे सवाल प्रेडिक्ट करें