2012-06-16 13 views
5

मुझे पता है कि जब हम वस्तुओं को पारित कर रहे हैं तो हम इसके संदर्भ को एक मूल्य के रूप में पारित कर रहे हैं। लेकिन आपको यह मान hashcode() विधि अधिकार का उपयोग कर रहा है (मेरे परीक्षणों के मुताबिक यह वही है)? चूंकि hashcode() स्मृति पता नहीं है और हर समय अद्वितीय मूल्य प्राप्त करने की गारंटी नहीं है, क्या ऑब्जेक्ट पास करते समय टकराव जैसी अजीब चीज़ें हो सकती हैं?जावा में वस्तुओं को पार करते समय वास्तव में क्या होता है?

(hashcode() मान लिया जाये कि ओवरराइड नहीं किया जा चुका है, यानी, यह System.identityHashCode() रूप में एक ही मान देता है)

तीन इस सवाल जैसे कई हैं, लेकिन मैं एक प्रासंगिक संसाधन जो discuses कि मूल्य जा रहा है क्या नहीं मिल सकता है पास हो गया और आप इसे कैसे प्राप्त करते हैं?

संपादित करें: यहां मेरा परीक्षण है। डिफ़ॉल्ट toSting()hashCode() का उपयोग करता है और इसे हेक्स मान में परिवर्तित करता है। तो जब हम वस्तुओं को पारित कर रहे हैं, तो क्या यह मूल्य पारित किया जा रहा है? या जावा सभी वस्तुओं (पारित होने) का ट्रैक रखने के लिए क्या करता है, इसलिए संदर्भ टकराव नहीं होगा?

Object o = new Object(); 
System.out.println(o); 
System.out.println(o.toString()); //both prints same thing - [email protected] 

उत्तर

6

hashcode() जावा के आंतरिक मेमोरी स्टोरेज के साथ किसी भी तरह से शामिल नहीं है। यह सिर्फ एक तरीका है जिसे एक अद्वितीय मूल्य वापस करना है जो किसी ऑब्जेक्ट का प्रतिनिधित्व कर सकता है।

अब, यह ऐसा होता है ऐसा होता है कि ऑब्जेक्ट का प्रतिनिधित्व करने के लिए एक अद्वितीय मूल्य प्राप्त करने का एक अच्छा तरीका अपने आंतरिक मेमोरी पते का उपयोग करना है। और यही है कि hashcode() का डिफ़ॉल्ट कार्यान्वयन करता है। लेकिन तथ्य यह है कि hashcode() एक स्मृति पते का उपयोग करता नहीं मतलब है कि hashcode()को परिभाषित करता है स्मृति पता करता है।

+0

जैसा कि आप कहते हैं कि डिफ़ॉल्ट कार्यान्वयन स्मृति पता देता है, तो इसकी कोई समस्या नहीं है। लेकिन मैंने जो देखा है वह यह है कि यह (डिफ़ॉल्ट फ़ंक्शन) स्मृति पता वापस करने की गारंटी नहीं देता है। लेकिन फिर क्या होता है जब 2^32 और हैशकोड() से अधिक ऑब्जेक्ट होते हैं तो एक पूर्णांक देता है जो 32 बिट्स है ?? – KillBill

+0

@ user601L 'हैशकोड()' मूर्खतापूर्ण विधि से नहीं है। कभी-कभी टकराव होते हैं। लेकिन यह हमेशा आपको वापस लौटने के लिए कुछ मूल्य मिलेगा, चाहे वह इसे प्राप्त करने के लिए अपने मेमोरी पते का उपयोग करता है या नहीं। आपको वास्तव में इसके बारे में चिंता नहीं करनी चाहिए, बस पता है कि किनारे के मामलों में टकराव संभव है। –

+0

@bohemian मेरे व्याकरण को सही करने के लिए धन्यवाद। Imaidiot। –

2

लेकिन इस मूल्य मिल hashCode() विधि सही उपयोग कर रहा है (मेरे परीक्षण के अनुसार यह एक ही है)?

सं

JSL से:

संदर्भ मूल्यों (अक्सर बस संदर्भ) इन वस्तुओं की ओर इशारा, और एक विशेष अशक्त संदर्भ, जो कोई वस्तु को संदर्भित करता है।

इस पेज से Harnessing Java

2

वस्तु की स्मृति पता है, जो भी क्या संदर्भ है पर आधारित है जावा में Object के लिए hashCode के डिफ़ॉल्ट कार्यान्वयन पढ़ें।

इसका मतलब यह नहीं है कि संदर्भ प्राप्त करने के लिए hashCode() कहा जाता है। ऐसा नहीं होता है। रेफरेंस वैरिएबल में इसे तत्काल (new Whatever()) से प्राप्त होने के बाद मेमोरी एड्रेस होता है। वास्तव में, कक्षा कार्यान्वयन के लिए हैशकोड() को कुछ अलग करने के लिए ओवरराइड करना आम है।

+7

डिफ़ॉल्ट कार्यान्वयन स्मृति पता वापस नहीं करता है। जावा वीएम नियमित रूप से कचरा संग्रह के [कॉम्पैक्ट] (http://en.wikipedia.org/wiki/Mark-compact_algorithm) चरण के दौरान ऑब्जेक्ट्स को स्थानांतरित करता है, इसलिए मेमोरी एड्रेस का उपयोग करके 'System.identityHashCode' अस्थिर हो जाएगा। –

1

JavaObjects संदर्भ द्वारा पारित किया जाता है जब आप Object वास्तव में मूल ऑब्जेक्ट संदर्भ पास करते हैं। एक हैशकोड उस ऑब्जेक्ट से जुड़े फ़ील्ड मानों पर निर्भर करता है। हैशकोड वास्तविक memory address. के साथ कुछ लेना देना नहीं है यह बहुत दुर्लभ है कि समान मान वाले दो ऑब्जेक्ट्स अलग-अलग hashcode हैं। यहां तक ​​कि अगर आप दो अलग अलग वस्तु बनाने, लेकिन एक ही मूल्यों उनके hashCode ही होगा हमेशा कितना आपके हैश फंक्शन कुशल

+0

मैं यहां डिफ़ॉल्ट हैशकोड() या system.identityhashcode() के बारे में बात कर रहा हूं। – KillBill

2

है कोई आवश्यकता या उम्मीद है कि कि hashCode() अद्वितीय होना नहीं है पर निर्भर करता है। यह एक पहचान विधि नहीं है।

हालांकि, जेडीके में से अधिकांश की अपेक्षा करते हैं कि a.equals(b), तो a.hashCode() == b.hashCode()

रिवर्स कभी उम्मीद नहीं की जाती है; यानी !a.equals(b) तो यह आवश्यक है कि a.hashCode() != b.hashCode()। हालांकि, यदि यह आमतौर पर मामले नहीं है तो प्रदर्शन भुगतना होगा। दूसरे शब्दों में, hashCode() में कुछ टकराव होने की उम्मीद है।

Object कक्षा में डिफ़ॉल्ट कार्यान्वयन hashCode() आम तौर पर को स्मृति पते उत्पन्नhashCode() का उपयोग करता है, लेकिन ऐसा नहीं वापसी पता करता है, और न ही भाषा कल्पना में कोई आवश्यकता नहीं यह करने के लिए नहीं है।