2013-01-25 19 views
5

संभव डुप्लिकेट:
What’s the implementation of hashCode in java Object?ऑब्जेक्ट क्लास में हैशकोड() विधि कैसे लागू की गई है?

मैं वस्तु वर्ग के माध्यम से ब्राउज़ कर रहा था, मैंने पाया केवल विधि hashCode() की घोषणा करता है। कार्यान्वयन भाग कहां है? यदि कोई कार्यान्वयन नहीं है तो हैशकोड() विधि मुझे परिणाम कैसे देती है?

+1

जो लोग इस प्रश्न को कम करना चाहते हैं, कृपया उत्तर साझा करने की देखभाल करें। धन्यवाद –

उत्तर

10

यह मूल कोड में लागू किया गया है। कार्यान्वयन के लिए, यह थोड़ा और मुश्किल है - आप डिफ़ॉल्ट कार्यान्वयन को बदल सकते हैं। यदि आप "ओपन जेडीके" स्रोतों को देखते हैं तो आपको निम्न विकल्प दिखाई देंगे:

-XX: हैशकोड = एन (0 से 5 तक)।

  • 0 - पार्क मिलर RNG (डिफ़ॉल्ट)
  • 1 - स्थिरांक 1
  • 3 - - sequenatial काउंटर
  • 4 - पता है और कुछ वैश्विक राज्य
  • 2 के समारोह का पता एक वस्तु
  • 5 - थ्रेड विशिष्ट XOR-शिफ्ट

आप यहां एक विस्तृत इम्प्लेमेनेटेशन पा सकते हैं: http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp

static inline intptr_t get_next_hash() फ़ंक्शन के स्रोत कोड और टिप्पणियों पर विचार करें।

+0

जानना बहुत अच्छा है ... पता नहीं था कि आप इसे भी अनुकूलित कर सकते हैं या नहीं। – ManojGumber

+0

यह मुझे वास्तविक जवाब लगता है !! – TechSpellBound

7

native कीवर्ड इंगित करता है कि इसे मूल कोड (JVM) में लागू किया गया है।

+0

धन्यवाद, लेकिन यह हैशकोड मूल्य कैसे और कैसे प्राप्त करता है और यह कैसे लौटाया जाता है? थोड़ी अंतर्दृष्टि कृपया !! –

+3

इसमें JVM के कोड को स्वयं शामिल करना होगा और यह जानना होगा कि तरीकों के जेएनआई (जावा नेटिव इंटरफेस) कार्यान्वयन कैसे उनकी जावा परिभाषाओं से बंधे हैं। मुझे विश्वास है कि वास्तविक मान JVM के कार्यान्वयन के बीच संगत नहीं है। यदि आपको वास्तविक मूल्य पर भरोसा करने की आवश्यकता है, तो अपनी आवश्यकताओं के अनुसार विधि को ओवरराइड करें। – akaIDIOT

+0

+1। और मुझे नहीं लगता कि हैशकोड के वास्तविक मूल्य और इसकी गणना के तरीके के बारे में एक विशिष्टता है। (लेकिन निश्चित रूप से, इसे किसी भी अन्य हैशकोड के रूप में आंतरिक रूप से संगत होने की आवश्यकता है)। – Thilo

5

आप देख hashcode की declaration

public native int hashCode(); 

घोषणा में native इंगित करता है कि यह JVM कोड में मूल रूप से लागू किया जाता है।

0

कार्यान्वयन भाग कहां है?

यह पहले से ही ढांचे द्वारा लागू किया गया है। Please see the documentation.

यदि कोई कार्यान्वयन नहीं है तो हैशकोड() विधि मुझे परिणाम कैसे देती है?

हालांकि, यदि आप एक कस्टम प्रकार बनाते हैं तो आप int मान उत्पन्न करने के लिए ज़िम्मेदार हैं जो वर्तमान स्थिति वस्तुओं का एक अच्छा प्रतिनिधित्व है। Here is a good example of that.

संबंधित मुद्दे