@Lombo के उत्तर में जोड़ना
आपको समतुल्य () से अधिक की आवश्यकता कब होगी?
ऑब्जेक्ट के बराबर () का डिफ़ॉल्ट कार्यान्वयन है
public boolean equals(Object obj) {
return (this == obj);
}
जिसका अर्थ है कि दो वस्तुओं को समान माना जाएगा, यदि उनके पास समान स्मृति पता होगा जो केवल तभी सत्य होगा जब आप किसी वस्तु की खुद से तुलना कर रहे हों।
लेकिन आप दो वस्तुओं पर एक ही विचार करना चाहते हैं यदि उनके पास एक या अधिक गुणों के लिए समान मूल्य हो (@Lombo के उत्तर में दिए गए उदाहरण को देखें)।
तो आप equals()
इन स्थितियों में आगे निकल जाएंगे और आप समानता के लिए अपनी खुद की शर्तें देंगे।
मैंने सफलतापूर्वक बराबर लागू किया है () और यह बहुत अच्छा काम कर रहा है। क्यों वे हैशकोड () को भी ओवरराइड करने के लिए कह रहे हैं?
जब तक आप अपने उपयोगकर्ता-परिभाषित वर्ग पर "हैश" आधारित संग्रह का उपयोग नहीं करते हैं , यह ठीक है। लेकिन भविष्य में कुछ समय आप उपयोग करना चाह सकते हैं HashMap
या HashSet
यदि आप नहीं करते हैं override
और हैशकोड () को "सही ढंग से लागू" करते हैं , तो ये हैश आधारित संग्रह इरादा के अनुसार काम नहीं करेंगे।
ओवरराइड केवल बराबर (@Lombo के उत्तर के अलावा)
myMap.put(first,someValue)
myMap.contains(second); --> But it should be the same since the key are the same.But returns false!!! How?
सबसे पहले, HashMap जाँच करता है कि क्या हैशकोड second
समान है first
। केवल यदि मान समान हैं, तो यह एक ही बाल्टी में समानता की जांच करने के लिए आगे बढ़ेगा।
लेकिन यहाँ हैशकोड इन 2 वस्तुओं के लिए अलग है (क्योंकि उनके पास अलग-अलग मेमोरी एड्रेस है-डिफ़ॉल्ट कार्यान्वयन से)। इसलिए यह समानता की जांच करने के लिए भी परवाह नहीं करेगा।
यदि आपके पास आपके ओवरराइड समान () विधि के अंदर एक विराम बिंदु है, तो यह अलग-अलग हैशकोड में नहीं होगा।
contains()
चेक hashCode()
और केवल अगर वे समान हैं तो यह आपकी equals()
विधि को कॉल करेगा ।
हम सभी बाल्टियों में समानता के लिए हाशप की जाँच क्यों नहीं करवा सकते? इसलिए मेरे लिए हैशकोड () को ओवरराइड करने की कोई आवश्यकता नहीं है !!
फिर आपको हैश आधारित संग्रह की बात याद आ रही है। निम्नलिखित को धयान मे रखते हुए :
Your hashCode() implementation : intObject%9.
बाल्टी के रूप में संग्रहीत कुंजी निम्नलिखित हैं।
Bucket 1 : 1,10,19,... (in thousands)
Bucket 2 : 2,20,29...
Bucket 3 : 3,21,30,...
...
कहो, आप जानना चाहते हैं कि क्या मानचित्र में कुंजी 10 है। क्या आप सभी बाल्टियों को खोजना चाहते हैं? या क्या आप केवल एक बाल्टी खोजना चाहेंगे?
हैशकोड के आधार पर, आप यह पहचानेंगे कि यदि 10 मौजूद है, तो यह 1 बाल्टी में मौजूद होना चाहिए। इसलिए केवल बाल्टी 1 की खोज की जाएगी !!