@erickson कम या ज्यादा सही है। java.lang.Object.hashCode()
द्वारा लौटा गया हैशकोड ऑब्जेक्ट के जीवनकाल के लिए नहीं बदलता है।
जिस तरह से यह (आमतौर पर) लागू किया गया है वह चालाक है। जब किसी ऑब्जेक्ट को कचरा कलेक्टर द्वारा स्थानांतरित किया जाता है, तो इसके मूल हैशकोड को फिर से उपयोग किए जाने पर कहीं भी संग्रहीत किया जाना चाहिए। इसे लागू करने का स्पष्ट तरीका हैशकोड को पकड़ने के लिए ऑब्जेक्ट हेडर में 32 बिट फ़ील्ड जोड़ना होगा। लेकिन वह प्रत्येक ऑब्जेक्ट में 1 शब्द ओवरहेड जोड़ देगा, और सबसे सामान्य मामले में जगह बर्बाद कर देगा ... जहां ऑब्जेक्ट की hashCode
विधि नहीं कहा जाता है।
समाधान ऑब्जेक्ट के ध्वज शब्द में दो ध्वज बिट्स जोड़ना है, और इन्हें निम्नानुसार (मोटे तौर पर) उपयोग करना है। पहला ध्वज सेट किया गया है जब hashCode
विधि कहा जाता है। दूसरा फ्लैग hashCode
विधि बताता है कि क्या ऑब्जेक्ट के वर्तमान पते को हैशकोड के रूप में उपयोग करना है, या संग्रहीत मूल्य का उपयोग करना है। जब जीसी किसी ऑब्जेक्ट को चलाता है और स्थानांतरित करता है, तो यह इन झंडे का परीक्षण करता है। यदि पहला ध्वज सेट किया गया है और दूसरा एक सेट नहीं है, तो जीसी ऑब्जेक्ट के अंत में एक अतिरिक्त शब्द आवंटित करता है और उस शब्द में मूल ऑब्जेक्ट स्थान संग्रहीत करता है। फिर यह दो झंडे सेट करता है। तब से, hashCode
विधि ऑब्जेक्ट के अंत में शब्द से हैशकोड मान प्राप्त करती है।
"जब भी यह एक के दौरान एक बार से अधिक एक ही वस्तु पर शुरू हो जाती है:
वास्तव में, एक identityHashCode
कार्यान्वयन इस तरह से व्यवहार करने के लिएgeneral hashCode contract के निम्न भाग को पूरा करने के है जावा एप्लिकेशन के निष्पादन, हैशकोड विधि को लगातार एक ही पूर्णांक वापस करना होगा, बशर्ते ऑब्जेक्ट पर तुलना के बराबर कोई भी जानकारी संशोधित न हो। यह पूर्णांक किसी अनुप्रयोग के निष्पादन से संगत नहीं रहना चाहिए एक ही आवेदन के दूसरे निष्पादन के लिए। "
identityHashCode()
का एक काल्पनिक कार्यान्वयन कि बस एक वस्तु का वर्तमान मशीन पता लौटे हाइलाइट किए गए भाग का उल्लंघन करता है, तो/जब जीसी किसी दूसरे पते पर वस्तु ले जाया जाएगा। इसके आस-पास एकमात्र तरीका (hypothetical) JVM के लिए यह गारंटी देने के लिए होगा कि एक ऑब्जेक्ट कभी भी hashCode
पर कॉल नहीं किया गया है। और इससे ढेर विखंडन के साथ गंभीर और अव्यवस्थित समस्याएं पैदा हो जाएंगी।
स्रोत
2010-09-26 07:25:58
यदि आप कुछ 'ऑब्जेक्ट.hashCode' के मान मुद्रित करते हैं, तो आप शायद देखेंगे कि वे पते होने की संभावना नहीं है। उदाहरण के लिए, किसी भी उचित कार्यान्वयन पर विषम संख्याएं। –