StringBuffer sb1 = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb1 == sb2);
System.out.println(sb1.equals(sb2));
दोनों यहां झूठी वापसी कर रहे हैं। यह कैसे संभव है?स्ट्रिंगबफर सामग्री की तुलना
StringBuffer sb1 = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb1 == sb2);
System.out.println(sb1.equals(sb2));
दोनों यहां झूठी वापसी कर रहे हैं। यह कैसे संभव है?स्ट्रिंगबफर सामग्री की तुलना
StringBuffer
की equals
विधि Object
से ओवरराइड नहीं है, इसलिए यह सिर्फ समानता, जैसे कि, ==
का उपयोग कर के रूप में ही संदर्भ है। मुझे संदेह है कि StringBuffer
संशोधित है, और ओवरराइडिंग equals
अधिकतर मूल्य-वर्गों के लिए उपयोगी है जो आप कुंजी के रूप में उपयोग करना चाहते हैं (हालांकि सूचियों में ओवरराइड equals
और StringBuffer
एक प्रकार की सूची है, इसलिए यह है थोड़ा असंगत)।
आप स्ट्रिंगबफर के भीतर वास्तविक तारों की बजाय स्ट्रिंगबफर ऑब्जेक्ट्स के संदर्भों की तुलना कर रहे हैं।
System.out.println(sb1.toString().equals(sb2.toString()))
सत्य वापस आ जाएगा और मुझे लगता है कि यह वही है जो आपने अपेक्षित किया था या हासिल करना चाहता था।
StringBuffer
का अपना कोई equals
विधि के लिए लगता है, इसलिए मेरा पहला अनुमान होगा कि StringBuffer
विरासत Object
की equals
विधि है, जो sb1 == sb2
का उपयोग कर तुलना करती है। इसलिए, दोनों विधियां एक ही परिणाम उत्पन्न करती हैं।
दोनों वस्तुओं के दो संदर्भों की तुलना करता है (एसबी 1 एक है, और एसबी 2 दूसरा है), इस प्रकार दोनों अलग हैं।
आप सामग्री की तुलना करने की कोशिश कर रहे हैं - उपयोग विधि compareTo (...) में स्ट्रिंग वर्ग - जो है - पहली विधि toString() का उपयोग कर स्ट्रिंग StringBuffer की सामग्री प्राप्त (.toString() तुलना करें)।
Ps। जेडीके 5 के रूप में, एक और तेज़ वर्ग है जो स्ट्रिंगबफर पर व्यवहार करता है - यह स्ट्रिंगबिल्डर
है, और
भी है लेकिन यह थ्रेड सुरक्षित नहीं है।
StringBuffer sb1 = new StringBuffer("Java");
StringBuffer sb2 = new StringBuffer("Java");
System.out.println(sb1.toString().compareTo(sb2.toString()));
सरल जवाब है कि StringBuffer (और StringBuilder) Object.equals के आधार अर्थ विज्ञान को फिर से परिभाषित नहीं है()। तो स्ट्रिंगबफर पर equals
बस ऑब्जेक्ट संदर्भों की तुलना करेगा।
वास्तव में, स्ट्रिंग, StringBuffer, StringBuilder और CharBuffer सभी CharSequence इंटरफ़ेस को लागू है, और इस इंटरफेस के लिए जावाडोक कहना है कि यह:
यह इंटरफ़ेस बराबरी और hashCode तरीकों में से सामान्य अनुबंध को परिष्कृत नहीं है। CharSequence को लागू करने वाली दो ऑब्जेक्ट्स की तुलना करने का नतीजा इसलिए सामान्य रूप से अपरिभाषित है। प्रत्येक वस्तु को एक अलग वर्ग द्वारा कार्यान्वित किया जा सकता है, और इस बात की कोई गारंटी नहीं है कि प्रत्येक वर्ग दूसरे के साथ समानता के लिए अपने उदाहरणों का परीक्षण करने में सक्षम होगी। इसलिए किसी सेट में तत्वों या मानचित्र में कुंजियों के रूप में मनमाना CharSequence उदाहरणों का उपयोग करना अनुचित है।
आश्चर्यजनक क्यों StringBuffer
equals
विधि को ओवरराइड नहीं करता है। शायद क्योंकि वस्तु की सामग्री toString()
विधि द्वारा प्राप्त की जाती है और जिसकी वांछित विधि है।
1. System.out.println(sb1 == sb2);
स्ट्रिंगबफर की बराबर विधि केवल तभी सच होती है जब स्ट्रिंगबफर ऑब्जेक्ट की तुलना स्वयं की तुलना में की जाती है। किसी भी अन्य स्ट्रिंगबफर की तुलना में यह झूठी वापसी करता है, भले ही दोनों में एक ही अक्षर हों।
इसका कारण यह है "==" संदर्भ समानता जाँच करता है और के बाद से दोनों SB1 और SB2 अलग वस्तु संदर्भ हैं, इसलिए इस मामले में उत्पादन "गलत"
फिर भी है आप की जाँच करने के लिए यदि सामग्री है चाहते हैं बराबर इन दो StringBuffer वस्तुओं में, आप इसका उपयोग कर सकते हैं:
sb1.toString().equals(sb2.toString())
2. System.out.println(sb1.equals(sb2));
इस रूप में "गलत" उत्पादन दे रहा है क्योंकि .equals() विधि StringBuffer वर्ग में अधिरोहित नहीं किया गया है। तो यह अपने मूल "ऑब्जेक्ट" वर्ग से .equals() विधि का उपयोग कर रहा है। ऑब्जेक्ट क्लास में .equals() संदर्भ समानता की जांच करने के लिए लिखा गया है।
ध्यान दें कि sb3.equals (sb4) स्ट्रिंग के मामले में "सत्य" लौटाएगा। क्योंकि दो अलग-अलग स्ट्रिंग्स की सामग्री को जांचने और मिलान करने के लिए स्ट्रिंग क्लास में .equals() विधि को ओवरराइड कर दिया गया है।
स्ट्रिंगबफर का equals()
ओवरराइड नहीं है। यह मानों की तुलना नहीं करता है, यह केवल संदर्भ मूल्य असाइनमेंट की तुलना करता है। यही कारण है कि आप झूठ बोल रहे हैं क्योंकि वे दोनों अलग-अलग वस्तुओं का जिक्र कर रहे हैं।
स्ट्रिंगबुइडरर थ्रेडसेफ नहीं है, जहां तक मुझे पता है कि – Yaneeve
स्ट्रिंगबिल्डर थ्रेड सुरक्षित नहीं है। स्ट्रिंगबिल्डर पर एसडीके दस्तावेज़ों से: "स्ट्रिंगबफर के साथ संगत, लेकिन ** सिंक्रनाइज़ेशन की कोई गारंटी ** **, यहां परिचय अनुच्छेद से: http://java.sun.com/j2se/1.5.0/docs/api/ जावा/लैंग/StringBuilder.html –
बेशक, मेरा बुरा। स्ट्रिंगबफर के दस्तावेज़ को बहुत तेज़ी से पढ़ें, आईटी स्ट्रिंगबिल्डर द्वारा पूरक है, इस प्रकार यह एक धागे द्वारा उपयोग के लिए है। उसके लिए खेद है। – mkolodziejski