2015-07-23 8 views
8

System.identityhashcode() और hashCode() विधि का उपयोग कब करें? *System.identityhashcode() और हैशकोड() विधि का उपयोग कब करें?

+1

के संभावित डुप्लिकेट [कैसे hashCode() और identityHashCode (करते हैं) बैक एंड पर काम करें?] (http: // stackoverflow।कॉम/प्रश्न/4930781/कैसे करें-हैशकोड-और-पहचानशोधक-कार्य-पर-बैक-एंड) –

उत्तर

-1

ठीक है, शुरुआत के लिए, जबकि निश्चित रूप से प्रणाली एक hashCode() विधि है (हर वस्तु एक है), मैं नहीं दिख रहा है इसे कॉल करने में बहुत अधिक कारण। या सिस्टम ऑब्जेक्ट को इसे कॉल करने का कोई मौका भी है, क्योंकि सिस्टम final है और कन्स्ट्रक्टर private है। तो, शायद मुझे लगता है कि hashCode() के लिए "बहुत ज्यादा कभी नहीं", मुझे लगता है।

तो, यह हमें System.identityHashCode(Object) के साथ छोड़ देता है जो आपके ऑब्जेक्ट के लिए केवल डिफ़ॉल्ट हैशकोड मान देता है। इसलिए, दूसरे शब्दों में, आपको इसकी आवश्यकता नहीं होती है, क्योंकि यदि आप अपनी कक्षा में हैशकोड() विधि को ओवरराइड नहीं करते हैं, तो आपको अपने ऑब्जेक्ट्स के लिए डिफ़ॉल्ट रूप से वही वापसी मान मिल जाएगा (क्योंकि प्रभावी रूप से डिफ़ॉल्ट हैशकोड(), जब आपने हैशकोड() विधि को ओवरराइड नहीं किया है, तो बस System.identityHashCode(this) है)। इसका उपयोग करने के लिए कुछ उपयोग मामले हो सकते हैं, लेकिन वे बहुत दुर्लभ हैं।

0

आपके कुछ कक्षाएं आपके सिस्टम में hashcode() विधि ओवरराइड कर सकती हैं। उन वस्तुओं के लिए, यह विधि प्रदत्त ऑब्जेक्ट का हैश कोड प्रदान करती है क्योंकि इसे अपने अंतिम माता-पिता java.lang.Object से वापस कर दिया जाएगा। भाषा डिजाइनरों से विवरण देखने के लिए Java API देखें।

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

0

documentation से:

सार्वजनिक स्थैतिक int identityHashCode (वस्तु एक्स)

दिया वस्तु के रूप में डिफ़ॉल्ट विधि hashCode (द्वारा लौटा दिया जाएगा के लिए एक ही हैश कोड देता है), चाहे या दिए गए ऑब्जेक्ट की कक्षा हैशकोड() को ओवरराइड नहीं करती है। शून्य संदर्भ के लिए हैश कोड शून्य है।

ध्यान दें कि identityHashCode रिटर्न hashCodeObject कक्षा में कार्यान्वित किया है और कि क्या आप आमतौर पर चाहते हैं नहीं है, तो आप सिर्फ yourObject.hashCode() का उपयोग करना चाहिए के रूप में।

के बारे में अगर कोई इस विधि के लिए कुछ उपयोग के मामलों हो सकता है, यदि आप Objects आप के माध्यम से पुनरावृत्ति कर रहे हैं की एक सरणी है कि इसमें कुछ null हो सकता था, और आप उन वस्तुओं की hashCode की जरूरत है, System.identityHashCode(obj) का उपयोग कर आप एक बचत हो सकती है शून्य की जांच, एक सुधार के बड़े नहीं।

2

जावाडोक के अनुसार, System.identityHashCode(Object o):

दिया वस्तु के लिए एक ही हैश कोड के रूप में डिफ़ॉल्ट विधि hashCode (द्वारा लौटा दिया जाएगा) देता है, या नहीं, यह देखते हुए ऑब्जेक्ट के वर्ग को ओवरराइड करता है hashCode() । शून्य संदर्भ के लिए हैश कोड शून्य है।

तो, पहले स्थान पर, System.identityHashCode(nullReference) हमेशा आप 0, बजाय nullReference.hashCode() जो स्पष्ट रूप से आप क्रम में एक NullPointerException दे देंगे दे देंगे।,

public class MysteriousOne { 
    @Override 
    public int hashCode() { 
     return 0xAAAABBBB; 
    } 

    //override equals() and so on... 
} 

वर्ग को ओवरराइड करता है hashCode() है, जो बिल्कुल ठीक है, भले ही हर उदाहरण के लिए हैश कोड एक ही है, जो तथापि, ठीक नहीं है अगर होगा:

आइए, तथापि, निम्नलिखित वर्ग पर विचार आप कई मामलों की पहचान को अलग करना चाहते हैं। आमतौर पर, आप .toString() विधि (जो डिफ़ॉल्ट रूप से कक्षा नाम देता है, @ के बाद hashCode() आउटपुट) के बाद, उदाहरण के लिए, किसी ऑब्जेक्ट की असली पहचान जानने के लिए, लेकिन इस मामले में है उत्पादन एक ही होगा:

MysteriousOne first = new MysteriousOne(); 
MysteriousOne second = new MysteriousOne(); 
System.out.println("First: " + first); 
System.out.println("Second: " + second); 

उत्पादन होगा:

First: [email protected] 
Second: [email protected] 

तो, hashCode() के इस तरह के कार्यान्वयन होने कई उदाहरण की पहचान के बीच भेद करने के लिए असंभव है। कौन सा है जहां System.identityHashCode() आसान है।

यदि आप करते हैं

System.out.println("First: " + System.identityHashCode(first)); 
System.out.println("Second: " + System.identityHashCode(second)); 

आप भले ही अपनी कक्षा कार्यान्वयन के hashCode() रिटर्न एक निरंतर (वास्तव में यहाँ hashCode() की ओवरराइड कार्यान्वयन पर नहीं कहा जा जाएगा विभिन्न उदाहरणों के लिए दो अलग-अलग नंबर प्राप्त करना चाहते हैं, सब, के रूप में प्रति जावाडोक):

First: 366712642 
Second: 1829164700 

इसके अलावा, आप भी पुरातन System.identityHashCode(Object o) करने के लिए, पारित कर सकते हैं के रूप में वे उनकी संगत रैपर को बॉक्सिंग की जाएगी:

int i = 5; 
System.out.println(System.identityHashCode(i)); 

और जानकारी:

+0

मैं 'हैशकोड' के लेखक 'पहचान हैशकोड' का उपयोग करने के बजाय वास्तव में इस उत्तर से सहमत नहीं हूं,) 'इसके बजाय उस फ़ंक्शन को ठीक करना चाहिए :), प्रत्येक ऑब्जेक्ट इंस्टेंस के लिए एक ही स्थिर' हैशकोड 'होने के कारण विधि का अनुचित कार्यान्वयन लगता है। यह 'IdentHashCode' के लिए एक अच्छा उपयोग केस प्रतीत नहीं होता है। –

+1

यह इंगित करने के लिए सिर्फ एक नमूना था कि 'System.identityHashCode()' को कॉल करने के साथ, ओवरड्रीन 'हैशकोड()' कार्यान्वयन नहीं किया जाएगा। –

0

System.identityhashcode() हमेशा डिफ़ॉल्ट java.lang.Object कार्यान्वयन लौटने के लिए, एक विशेष वस्तु के लिए वर्ग इस ओवरराइड करता है, भले ही और एक अलग हैश कोड की गणना करता है।

कुछ परिस्थितियों में, आपको इस तरह की परिभाषा की आवश्यकता हो सकती है: दो ऑब्जेक्ट्स ओ 1 और ओ 2 बराबर माना जाता है अगर केवल ओ 1 == o2। सामान्य कार्यान्वयन में, दो ऑब्जेक्ट्स ओ 1 और ओ 2 बराबर माना जाता है यदि केवल और यदि ओ 1 == शून्य? ओ 2 == शून्य: o1.equals (ओ 2)। यदि दो ऑब्जेक्ट बराबर हैं और केवल अगर ओ 1 == ओ 2, तो उनके पास एक ही हैशकोड होना चाहिए। तो आपको System.identityhashcode() का उपयोग करना चाहिए।

यहां कुछ कोड स्निपेट हैं जो मैं आया हूं।


private static int hash(Object x, int length) { 
    int h = System.identityHashCode(x); 
    // Multiply by -127, and left-shift to use least bit as part of hash 
    return ((h << 1) - (h << 8)) & (length - 1); 
} 

IdentityHashMap.java

public int hashCode() { 
    return System.identityHashCode(instance); 
} 

@Override 
@SuppressWarnings("rawtypes") 
public boolean equals(final Object other) { 
    return other instanceof IdentityWrapper && 
     ((IdentityWrapper) other).instance == instance; 
} 

IdentityWrapper.java (अपाचे से कॉमन्स पूल 2)

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