2009-09-24 9 views
17

मेरे पास TreeSet संग्रह और hashCode विधियों के बारे में एक त्वरित प्रश्न है। मेरे पास TreeSet है और मैं ऑब्जेक्ट जोड़ने से पहले ऑब्जेक्ट्स जोड़ रहा हूं, मैं यह देखने के लिए जांच करता हूं कि यह में contains विधि का उपयोग कर मौजूद है या नहीं।जावा - ट्रीसेट और हैशकोड()

2 अलग वस्तुओं, जिनमें से प्रत्येक एक अलग hashCode hashCode विधि के अपने कार्यान्वयन का उपयोग, नीचे दिए गए उदाहरण का उत्पादन किया है:

public int hashCode() 
{ 
    int hash = 7; 
    hash = hash * 31 + anAttribute.hashCode(); 
    hash = hash * 31 + anotherAttribute.hashCode(); 
    hash = hash * 31 + yetAnotherAttribute.hashCode(); 
    return hash; 
} 

एक विशेष रन के लिए hashCodes हैं: केवल 76,126,352 और 76,126,353 (वस्तुओं एक विशेषता में एक अंक से भिन्न)।

हैशकोड अलग-अलग हैं, भले ही इन ऑब्जेक्ट्स के लिए विधि सही हो रही है। कोई विचार क्यों? यह वास्तव में भ्रमित है और वास्तव में सराहना की जाएगी।

उत्तर

34

ट्रीसेट hashCode का उपयोग नहीं करता है। यह या तो compareTo या आपके द्वारा कन्स्ट्रक्टर को पारित तुलनाकर्ता का उपयोग करता है। यह सेट में ऑब्जेक्ट्स खोजने के लिए विधियों द्वारा उपयोग किया जाता है।

तो आपके प्रश्न का उत्तर यह है कि आपकी तुलना करने के लिए विधि या आपके तुलनात्मक परिभाषित किए गए हैं ताकि प्रश्न में दो वस्तुओं को बराबर माना जा सके।

javadocs से

:

एक TreeSet उदाहरण सभी तत्व तुलना अपने compareTo का उपयोग कर प्रदर्शन करती है (या तुलना) विधि है, तो दो तत्वों है कि इस विधि से बराबर माना जाता है के दृष्टिकोण से, कर रहे हैं सेट, बराबर।

+0

यह बराबर विधि का भी उपयोग करता है, इसलिए यह महत्वपूर्ण है कि बराबर और तुलनात्मक/तुलना करने के लिए सुसंगत रहे। –

+6

javadocs के अनुसार यह नहीं है। – sepp2k

+2

"ऐसा इसलिए है क्योंकि सेट इंटरफ़ेस को बराबर ऑपरेशन के संदर्भ में परिभाषित किया गया है, लेकिन एक ट्रीसेट उदाहरण इसकी तुलना का उपयोग करके सभी तत्व तुलना करता है (या तुलना करें) विधि ..." (http://java.sun.com/ से) JavaSE/6/docs/api/जावा/util/TreeSet।एचटीएमएल) – Dirk

3

जावा डॉक्टर से:

दो तो वस्तुओं बराबर (वस्तु) विधि, तो बुला दो वस्तुओं में से प्रत्येक पर hashCode विधि ही पूर्णांक परिणाम का उत्पादन होगा के अनुसार बराबर हैं।

मतलब: आपके द्वारा उपयोग की जाने वाली वस्तुओं के बराबर नहीं हैं।

+1

ऐसा लगता है कि हैशकोड और बराबर को इस तरह से परिभाषित किया गया है कि उस अनुबंध को तोड़ नहीं देता है। – sepp2k

+2

@ sepp2k यह * हैश कोड() ''के लिए' सामान्य अनुबंध है। यही कारण है कि यह 'जरूरी' शब्द का उपयोग करता है। – EJP

0

आपको यहोशू ब्लोच के "प्रभावी जावा" अध्याय 3 को पढ़ने की आवश्यकता है। यह समकक्ष अनुबंध और बराबर ओवरराइड, हैशकोड और तुलना करने के लिए कैसे समझाता है।

+0

यह ऑनलाइन भी उपलब्ध है: http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – gustafc

+0

मैं गस्टाफ की टिप्पणी को अपवर्तित करने के लिए तैयार था, लेकिन लिंक अब टूट गया है :( –

+0

पुस्तक खरीदें। अभी भी बाहर। – duffymo

0

आपको यह जांचने की आवश्यकता नहीं है कि यह निहित है, क्योंकि सम्मिलित() मूल रूप से सम्मिलन बिंदु के रास्ते पर एक ही ऑपरेशन (यानी उचित स्थिति खोज रहा है) करता है। यदि ऑब्जेक्ट डाला नहीं जा सकता है (यानी, ऑब्जेक्ट पहले से ही निहित है), रिटर्न रिटर्न डालें।

+0

यह एक बहुत ही साफ और संक्षिप्त एपीआई के लिए एक उदाहरण है (अधिकांश संग्रह कक्षाओं की तरह)। – helpermethod