2010-09-17 22 views
10

मैं उत्सुक हूं कि Object.toString() यह क्यों देता है:डिफ़ॉल्ट ऑब्जेक्ट .toString() हैशकोड का हेक्स प्रस्तुति क्यों देता है?

return getClass().getName() + "@" + Integer.toHexString(hashCode()); 

इसके विपरीत:

return getClass().getName() + "@" + hashCode(); 

हैश कोड को दशमलव के बजाय हेक्स कोड को प्रदर्शित करने से कौन से फायदे हैं?

+0

निकटता से संबंधित http://stackoverflow.com/questions/29140402/how-do-i-print-my-java-object-without-getting-sometype2f92e0f4 – Raedwald

उत्तर

9

Object.hashCodebased on a memory location where the object is located की गणना की जाती थी। स्मृति स्थान लगभग सार्वभौमिक रूप से हेक्साडेसिमल के रूप में प्रदर्शित होते हैं।

toString का डिफ़ॉल्ट वापसी मूल्य हैश कोड में इतना रूचि नहीं रखता है बल्कि डीबगिंग के उद्देश्य के लिए वस्तु को विशिष्ट रूप से पहचानने के तरीके में है, और हैश कोड पहचान के उद्देश्य के लिए अच्छी तरह से सेवा करता है (वास्तव में , वर्ग का नाम + स्मृति पता वास्तव में अद्वितीय है, और जबकि हैश कोड अद्वितीय होने की गारंटी नहीं है, यह अक्सर नज़दीक आता है)।

+12

सख्ती से 'Object.hashCode() 'बोलता है, यह लौटाता है एक संख्या है कि * कुछ JVMs * ऑब्जेक्ट के स्थान पर आधारित है * उस समय जब विधि को पहले * कहा जाता है। जीसी वस्तु को स्थानांतरित कर सकता है, लेकिन 'हैशकोड' वही रहना चाहिए। –

+4

वास्तव में ** कोई ** JVMs है जिसके लिए यह स्मृति स्थान लौटाता है? – Raedwald

+3

कथन कि "ऑब्जेक्ट.hashCode' डिफ़ॉल्ट रूप से एक मेमोरी एड्रेस लौटाता है" पिछले दशक में जारी सभी सूर्य/ओरेकल जेवीएम के लिए गलत है, सीएफ। http://stackoverflow.com/questions/16105420/java-object-hashcode-address-or-random/16105878#16105878। क्या आपके पास कुछ अन्य JVM कार्यान्वयन दिमाग में हैं या क्या आप कहने का मतलब है कि हैशकोड ** ** स्मृति स्थान लौटाता है? – meriton

9

मुझे स्वीकृत उत्तर पसंद नहीं है। मेरा जवाब यहाँ है।

संक्षिप्त उत्तर: क्योंकि हेक्स को याद रखना आसान है, क्योंकि हेक्स में व्यक्त की गई संख्या कम है और दशमलव में व्यक्त की गई समान संख्या की तुलना में एक बड़ी वर्ण विविधता है।

लंबा उत्तर: आप अपने सिर में अंकगणित करने के लिए हैश कोड का उपयोग नहीं करेंगे, इसलिए आपको वास्तव में दशमलव में होने की आवश्यकता नहीं है। दूसरी तरफ, आप इसे एकमात्र तरीके से इस्तेमाल करने जा रहे हैं जिसका उपयोग करने का इरादा है, यानी यह बताना है कि दो हैश कोड एक ही वस्तु, या विभिन्न वस्तुओं को संदर्भित करते हैं। दूसरे शब्दों में, आप किसी ऑब्जेक्ट के लिए इसे एक अद्वितीय पहचानकर्ता या निमोनिक के रूप में उपयोग करेंगे। इस प्रकार, तथ्य यह है कि यह एक संख्या है अप्रासंगिक है; आप इसे हैश स्ट्रिंग के रूप में भी सोच सकते हैं। खैर, ऐसा ही होता है कि हमारे मस्तिष्क को केवल 10 अलग-अलग वर्णों से युक्त लंबे तारों की तुलना में 16 अलग-अलग वर्णों से युक्त छोटे तारों (तुलना के उद्देश्य के लिए) को बनाए रखना बहुत आसान लगता है।

+3

संबंधित नोट पर, यदि संख्या दशमलव में प्रदर्शित की गई थी, तो लोगों को कुछ "मतलब" होने की अपेक्षा करने के लिए अधिक प्रवण हो सकता है। उदाहरण के लिए, "फॉनर्ड # 1 9 4" "फोर्ड @ 15 9 सी 8 ईए 5" की तुलना में 1 9 4 वें फ्नॉर्ड की तरह बहुत अधिक लगता है। एक स्नेही दृष्टिकोण से, अन्य अल्फान्यूमेरिक एन्कोडिंग कम और अधिक आसानी से प्रतिष्ठित हो सकती हैं, लेकिन मुझे लगता है कि जावा किसी भी अक्षर अनुक्रमों को उत्पन्न करने की किसी भी संभावना से बचना चाहता था जिसे आक्रामक समझा जा सकता था। – supercat

+0

हम इस उद्देश्य के लिए इसका इस्तेमाल करते हैं। मुझे पता होना चाहिए (तूफान में) जो 5 में से बनी रहती है, हम कितनी राशि बना रहे हैं। तो हमारे लॉगिंग में हम बोल्ट के एक उदाहरण पर सॉर्ट करने के लिए इसका इस्तेमाल करते हैं। – markthegrea

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