2013-06-14 6 views
10

लाइन # 3 के बजाय लाइन # 4 करने का उचित समय कब होगा? या वे पूरी तरह से अनावश्यक invokes हैं?System.identityHashCode (obj) का उपयोग - कब? क्यूं कर?

1 Object o1 = new Object(); 

2 

3 int hcObj = o1.hashCode(); 

4 int hcSys = System.identityHashCode(o1); 
+0

उहम, अच्छा सवाल ... वैसे, दोनों विधियां एक int लौटती हैं, लंबे समय तक नहीं – fge

उत्तर

11

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

कुशलतापूर्वक ऐसा करने के लिए (यानी किसी प्रकार की हैश तालिका द्वारा समर्थित) आप समानता की बजाय पहचान पर आधारित हैश कोड चाहते हैं - जो वास्तव में identityHashCode आपको देता है। यह शायद ही कभी उपयोगी है, लेकिन यह कई बार आसानी से काम कर सकता है।

+0

संक्षेप में, अमरूद की समतुल्यता() 'क्या करती है? लेकिन फिर भी, आपके पास 'IdentityHash {Map, Set}' – fge

+3

@fge है: 'System.identityHashCode' यह है कि उन सभी डेटा संरचनाओं को कैसे कार्यान्वित किया जाता है। –

+0

"(कुछ ऑब्जेक्ट्स बराबर लागू होते हैं जब आप वास्तव में उन्हें नहीं चाहते हैं)" अपने उत्तर के इस हिस्से को प्यार करें। धन्यवाद। –

3

सादे Object के लिए, हाँ, यह अनावश्यक है। लेकिन ऐसे मामले हैं जहां एक वर्ग hashCode ओवरराइड किए गए किसी प्रकार के उदाहरण पर डिफ़ॉल्ट hashCode कार्यान्वयन (संदर्भ समानता के आधार पर) का उपयोग करना चाह सकता है।

Grepcode lists these call sites, अर्थात् IdentityHashMap सहित अन्य लोगों के साथ।

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