System.identityhashcode() और hashCode() विधि का उपयोग कब करें? *System.identityhashcode() और हैशकोड() विधि का उपयोग कब करें?
उत्तर
ठीक है, शुरुआत के लिए, जबकि निश्चित रूप से प्रणाली एक hashCode()
विधि है (हर वस्तु एक है), मैं नहीं दिख रहा है इसे कॉल करने में बहुत अधिक कारण। या सिस्टम ऑब्जेक्ट को इसे कॉल करने का कोई मौका भी है, क्योंकि सिस्टम final
है और कन्स्ट्रक्टर private
है। तो, शायद मुझे लगता है कि hashCode()
के लिए "बहुत ज्यादा कभी नहीं", मुझे लगता है।
तो, यह हमें System.identityHashCode(Object)
के साथ छोड़ देता है जो आपके ऑब्जेक्ट के लिए केवल डिफ़ॉल्ट हैशकोड मान देता है। इसलिए, दूसरे शब्दों में, आपको इसकी आवश्यकता नहीं होती है, क्योंकि यदि आप अपनी कक्षा में हैशकोड() विधि को ओवरराइड नहीं करते हैं, तो आपको अपने ऑब्जेक्ट्स के लिए डिफ़ॉल्ट रूप से वही वापसी मान मिल जाएगा (क्योंकि प्रभावी रूप से डिफ़ॉल्ट हैशकोड(), जब आपने हैशकोड() विधि को ओवरराइड नहीं किया है, तो बस System.identityHashCode(this)
है)। इसका उपयोग करने के लिए कुछ उपयोग मामले हो सकते हैं, लेकिन वे बहुत दुर्लभ हैं।
आपके कुछ कक्षाएं आपके सिस्टम में hashcode()
विधि ओवरराइड कर सकती हैं। उन वस्तुओं के लिए, यह विधि प्रदत्त ऑब्जेक्ट का हैश कोड प्रदान करती है क्योंकि इसे अपने अंतिम माता-पिता java.lang.Object
से वापस कर दिया जाएगा। भाषा डिजाइनरों से विवरण देखने के लिए Java API देखें।
मुझे विश्वास है कि उपयोग तब होता है जब आप कुछ कारणों से लगभग गैर-अद्वितीय वस्तुओं को बनाना चाहते हैं। जब मैं लगभग कहता हूं, वही हैश कोड वाले ऑब्जेक्ट हो सकते हैं। आप वास्तव में ऐसा करने में equals
विधियों के उपयोग को कम कर देंगे।
documentation से:
सार्वजनिक स्थैतिक int identityHashCode (वस्तु एक्स)
दिया वस्तु के रूप में डिफ़ॉल्ट विधि hashCode (द्वारा लौटा दिया जाएगा के लिए एक ही हैश कोड देता है), चाहे या दिए गए ऑब्जेक्ट की कक्षा हैशकोड() को ओवरराइड नहीं करती है। शून्य संदर्भ के लिए हैश कोड शून्य है।
ध्यान दें कि identityHashCode
रिटर्न hashCode
Object
कक्षा में कार्यान्वित किया है और कि क्या आप आमतौर पर चाहते हैं नहीं है, तो आप सिर्फ yourObject.hashCode()
का उपयोग करना चाहिए के रूप में।
के बारे में अगर कोई इस विधि के लिए कुछ उपयोग के मामलों हो सकता है, यदि आप Objects
आप के माध्यम से पुनरावृत्ति कर रहे हैं की एक सरणी है कि इसमें कुछ null
हो सकता था, और आप उन वस्तुओं की hashCode
की जरूरत है, System.identityHashCode(obj)
का उपयोग कर आप एक बचत हो सकती है शून्य की जांच, एक सुधार के बड़े नहीं।
जावाडोक के अनुसार, 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));
और जानकारी:
मैं 'हैशकोड' के लेखक 'पहचान हैशकोड' का उपयोग करने के बजाय वास्तव में इस उत्तर से सहमत नहीं हूं,) 'इसके बजाय उस फ़ंक्शन को ठीक करना चाहिए :), प्रत्येक ऑब्जेक्ट इंस्टेंस के लिए एक ही स्थिर' हैशकोड 'होने के कारण विधि का अनुचित कार्यान्वयन लगता है। यह 'IdentHashCode' के लिए एक अच्छा उपयोग केस प्रतीत नहीं होता है। –
यह इंगित करने के लिए सिर्फ एक नमूना था कि 'System.identityHashCode()' को कॉल करने के साथ, ओवरड्रीन 'हैशकोड()' कार्यान्वयन नहीं किया जाएगा। –
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)
- 1. System.identityHashCode (obj) का उपयोग - कब? क्यूं कर?
- 2. हैशकोड को कैसे कार्यान्वित करें और विधि
- 3. ट्यूपल का उपयोग कब और कब करें?
- 4. हैशकोड के लिए हैशकोड और बराबर
- 5. viewDidLoad का उपयोग कब करें और awakeFromNib
- 6. ग्रहण बराबर()/हैशकोड() गेटर्स का उपयोग करें
- 7. IEquatable का उपयोग कब करें और क्यों
- 8. टैग/लेबल का उपयोग कब करें और शाखा कब करें?
- 9. undef_method का उपयोग कब करें, और remove_method का उपयोग कब करें?
- 10. PHP: लक्षणों का उपयोग कब करें और स्थिर विधियों का उपयोग कब करें?
- 11. कीवर्ड का उपयोग कब करें
- 12. हाइबरनेट फ़ेचिंग रणनीति - "शामिल" का उपयोग कब करें और "चयन करें" का उपयोग कब करें?
- 13. टेम्पलेट विधि बनाम कब उपयोग करें। रणनीति?
- 14. "willChangeValueForKey" और "didChangeValueForKey" का उपयोग कब करें?
- 15. क्यों और कब __noop का उपयोग करें?
- 16. मॉलोक का उपयोग कब और क्यों करें?
- 17. स्टब्स और मोजे का उपयोग कब करें?
- 18. socket.io का उपयोग कब करें और AJAX
- 19. गुण और विधियों का उपयोग कब करें?
- 20. Jquery - "यह" कब उपयोग करें और "$ (यह)" कब उपयोग करें?
- 21. क्या "डिस्प्ले का उपयोग कब करें: ब्लॉक कब करें: इनलाइन और कब: इनलाइन-ब्लॉक" और क्यों?
- 22. क्लोजर में "अगर" और "कब" का उपयोग कब करें?
- 23. OSGi EventAdmin का उपयोग कब करें और कब नहीं?
- 24. डेटाबेस दृश्यों का उपयोग कब करें और कब नहीं?
- 25. .mdf और कब .sdf का उपयोग कब करें?
- 26. डब्ल्यूसीएफ डेटा सेवाओं का उपयोग कब करें और कब नहीं?
- 27. Request.RegisterForDispose का उपयोग कब करें?
- 28. जावा - ट्रीसेट और हैशकोड()
- 29. मैं initWithCoder का उपयोग कब करूं: विधि?
- 30. एक संपत्ति बनाम एक विधि का उपयोग कब करें?
के संभावित डुप्लिकेट [कैसे hashCode() और identityHashCode (करते हैं) बैक एंड पर काम करें?] (http: // stackoverflow।कॉम/प्रश्न/4930781/कैसे करें-हैशकोड-और-पहचानशोधक-कार्य-पर-बैक-एंड) –