2012-06-20 25 views
22

स्ट्रिंगबफर/स्ट्रिंगबिल्डर क्यों equals(), hashcode() ऑब्जेक्ट से विधियों को ओवरराइड नहीं करता है?स्ट्रिंगबफर/स्ट्रिंगबिल्डर क्यों बराबर या हैशकोड ओवरराइड नहीं करता है?

कृपया मुझे सुझाव है कि स्पष्ट तस्वीर मदद करता है कि समस्या को समझने ...

उत्तर

31

क्योंकि StringBuffer परिवर्तनशील है, और इसकी प्राथमिक उपयोग तार के निर्माण के लिए है। यदि आप सामग्री की तुलना करना चाहते हैं, तो StringBuffer#toString() पर कॉल करें और लौटाए गए मूल्य की तुलना करें।

यह इस तरह के एक उद्देश्य यह है कि एक HashMap में एक महत्वपूर्ण के रूप में प्रयोग किया जाता है को संशोधित करने के बाद से कारण बन सकता है करने के लिए किया जा संग्रहीत मूल्य आम तौर पर अस्थायी वस्तुओं के लिए hashCode() ओवरराइड करने के लिए उपयोगी नहीं है, "खो दिया है।"

+0

म्यूटेबल का अर्थ यहां क्या है? – Saravanan

+4

यदि आप बहुत बुनियादी सिद्धांतों को नहीं समझते हैं तो कुछ शोध करें: http://stackoverflow.com/questions/3554192/what-is-a-mutable-class-in-oop –

+1

सभी उचित सम्मान के साथ मैं आपके बयान से असहमत हूं _ यह आमतौर पर mutable ऑब्जेक्ट्स के लिए हैशकोड() को ओवरराइड करने के लिए उपयोगी नहीं है ..._ – Shahzeb

5

असल में इस सब कुछ के पीछे हैशकोड कोड मान पर निर्भर करता है।

String str1 = new String("sunil"); 
String str2 = new String("sunil"); 

HashMap hm = new HashMap() 
hm.put(str1,"hello"); 
hm.put(str2,"bye"); 

अंतिम एचएम:

hm = { sunil=bye } 

उपरोक्त कोड, str1 और str2 में दो अलग-अलग स्ट्रिंग वस्तुओं रहे हैं इस अवधारणा को समझने के लिए एक उदाहरण ले सकते हैं। इसे हैश मैप में जोड़ा जाना चाहिए? उत्तर नहीं है। क्योंकि हैश मैप में मूल्य डालने/डालने से पहले, यह आंतरिक रूप से str1, str2 हैशकोड मान की जांच और तुलना करता है। दोनों एक ही हैकोड मान को फिर से शुरू करते हैं क्योंकि स्ट्रिंग क्लास ओवरराइड बराबर() और हैशकोड() विधि है। तो hm.put(str2,"bye"); निष्पादित करने पर पहली कुंजी नए मान के साथ ओवरराइड हो जाएगी। अब इस प्रयास करें:

StringBuilder sb1 = new StringBuilder("sunil"); 
StringBuilder sb2 = new StringBuilder("sunil"); 

HashMap hm = new HashMap() 
hm.put(sb1,"hello");//sb1 and sb2 will return different HashCode 
hm.put(sb2,"bye");// StringBuffer/StringBuilder does not override hashCode/equals methods 

अंतिम एचएम:

{sunil=hello, sunil=bye} 

दोनों मूल्य HashMap में जोड़ दिया जाएगा क्योंकि SB1 और SB2 दोनों अलग hashCode देता है। स्ट्रिंगबिल्डर/स्ट्रिंगबफर बराबर() और हैशकोड() विधि को ओवरराइड नहीं करता है।

सन माइक्रोसिस्टम प्रोग्रामर चाहता था Hashtable या किसी अन्य हैश संग्रह पसंद करती है (HashSet, HashMap ...) में मूल्यों के 2 अलग स्ट्रिंग तरह जोड़ने की अनुमति के लिए, यही कारण है hashCode() और बराबरी() StringBuffer में जानबूझकर ओवरराइड नहीं कर रहे थे , स्ट्रिंगबिल्डर वर्ग।

+0

'सूर्य माइक्रोसिस्टम चाहता था कि प्रोग्रामर हैशटेबल में 2 अलग-अलग स्ट्रिंग प्रकार के मान जोड़ने की अनुमति दे ...' यह सच नहीं है, [हैशटेबल'] के लिए javadocs (https: // docs। oracle.com/javase/8/docs/api/java/util/Hashtable.html) और ['मानचित्र'] (https://docs.oracle।com/javase/8/docs/api/java/use/Map.html) कुंजी के रूप में टूटा हुआ 'बराबर/हैशकोड' अनुबंध वाले ऑब्जेक्ट्स का सक्रिय रूप से हतोत्साहित करते हैं। मानचित्र में 'स्ट्रिंगबिल्डर' ऑब्जेक्ट्स को संग्रहीत करना उपयोगी नहीं है क्योंकि जब तक आपकी मूल वस्तु न हो तब तक आप कुंजी द्वारा मान प्राप्त नहीं कर पाएंगे। –

-2

क्योंकि स्ट्रिंगबफर परिवर्तनीय है। उदाहरण के साथ इसे आजमाएं :)

package test; 

import java.util.HashMap; 

public class CheckHashcodeEquals { 

    public static void main(String[] args) { 

     /* 
     * String class override equals() and hashcode() method thats way 
     * override value of HashMap 
     */ 
     String s1 = new String("Arya"); 
     String s2 = new String("Arya"); 
     HashMap hm = new HashMap<>(); 
     hm.put(s1, "A1"); 
     hm.put(s2, "A2"); 
     System.out.println(hm); /* Output: {Arya=A2} */ 

     /* 
     * String class does not override equals() and hashcode() method thats 
     * way insert duplicate value 
     */ 
     StringBuffer sb1 = new StringBuffer("Arya"); 
     StringBuffer sb2 = new StringBuffer("Arya"); 
     HashMap hm2 = new HashMap<>(); 
     hm2.put(sb1, "A1"); 
     hm2.put(sb2, "A2"); 
     System.out.println(hm2); /* Output: {Arya=A2, Arya=A1} */ 
    } 

} 
+0

यह उदाहरण दर्शाता है कि 'स्ट्रिंगबफर' 'बराबर' और 'हैशकोड' ओवरराइड नहीं करता है, लेकिन यह क्यों नहीं दिखाता है। जवाब स्वयं ('क्योंकि स्ट्रिंगबफर म्यूटेबल है') को पहले के उत्तर से कॉपी किया गया है। –

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