2013-09-02 2 views
17
class strb 
{ 

    static public void main(String...string) 
    { 
     StringBuilder s1 = new StringBuilder("Test"); 
     StringBuilder s2 = new StringBuilder("Test"); 

     System.out.println(s1); 
     System.out.println(s2); 
     System.out.println(s1==s2); 
     System.out.println(s1.equals(s2)); //Line 1 
     System.out.println(s1.toString()==s2.toString()); //Line 2 
     if(s1.toString()==s2.toString())System.out.println("True"); //Line 3 
    } 

} 

और उत्पादनStringBuilder .equals जावा

Test 
Test 
false 
false 

बस .equals पर एक त्वरित सवाल है है।

ऑब्जेक्ट सामग्री के बावजूद, क्या असमानता केवल तभी सही होती है जब ऑब्जेक्ट संदर्भ दोनों एक ही ऑब्जेक्ट को इंगित करते हैं?

==========

संपादित करें: अब मैं .equals के बारे में हिस्सा समझते हैं लेकिन क्यों लाइन 2 और लाइन 3 भी सच वापस नहीं करता है?

संपादित करें: मेरा मानना ​​है कि == संदर्भ चर के पते पर लग रहा है और इतने एस 1 और s2 मुझे equal.correct नहीं किया जा सकता है, तो मेरी धारणा सही

+1

इस धागे को देखें http://stackoverflow.com/questions/11112602/why-does-stringbuffer-stringbuilder-not-override-equals-or-hashcode और http://stackoverflow.com/questions/11007387/what- एक कुशल-तरीके-से-तुलना-स्ट्रिंगबिल्डर-ऑब्जेक्ट्स – krishnakumarp

उत्तर

37

हां, StringBuilder does not override Object's .equals() function, जिसका अर्थ है कि दो ऑब्जेक्ट संदर्भ समान नहीं हैं और परिणाम गलत है।

StringBuilder के लिए, आप इस्तेमाल कर सकते हैं s1.toString().equals(s2.toString())

अपने संपादित के लिए, आप दो अलग अलग स्ट्रिंग वस्तुओं पर == ऑपरेटर कॉल कर रहे हैं। == ऑपरेटर झूठी वापसी करेगा क्योंकि ऑब्जेक्ट्स अलग हैं। स्ट्रिंग्स की तुलना करने के लिए, आप उपयोग करना String.equals() या String.equalsIgnoreCase()

यह एक ही समस्या आप पहले

+0

क्या आपको पता है क्यों स्ट्रिंगबिल्डर बराबर() विधि को ओवरराइड नहीं करता है। यह अजीब लगता है। – Algorithmist

+3

अनिवार्य रूप से, अगर मुझे लगता है कि, यदि आपके पास दो स्ट्रिंगबिल्डर हैं, तो आप परीक्षण करने की अधिक संभावना रखते हैं कि वे एक ही स्ट्रिंगबिल्डर हैं जो एक ही स्ट्रिंग के साथ दो अलग-अलग बिल्डरों की बजाय आपकी स्ट्रिंग का निर्माण कर रहे हैं। मैं कई मामलों के बारे में नहीं सोच सकता जहां दो अलग-अलग तत्काल स्ट्रिंगबिल्डर एक ही चीज़ का निर्माण करेंगे। – hotforfeature

+0

आपकी पहली वाक्य के बारे में, मैंने सोचा "==" परीक्षण संदर्भ, और ".equals()" परीक्षण ऑब्जेक्ट मान? – vkapustin

3

आप के रूप में है वस्तु वर्ग के लिए .equals के डिफ़ॉल्ट कार्यान्वयन नहीं है उल्लेख किया।

अन्य कक्षाएं इस व्यवहार को ओवरराइड कर सकती हैं। स्ट्रिंगबिल्डर उनमें से एक नहीं है।

स्ट्रिंग उनमें से एक है, जो यह सुनिश्चित करने के लिए ओवरराइड करता है कि दोनों ऑब्जेक्ट्स के स्ट्रिंग प्रस्तुतियों के परिणामस्वरूप वर्णों का एक ही अनुक्रम होता है। String API

प्रश्न में विशिष्ट वस्तु के लिए प्रलेखन का संदर्भ लें।

0

ऊपर प्रतिक्रियाओं दोनों के साथ सहमत कर रहे थे है की जरूरत है, लेकिन आप क्या कर सकते हैं वास्तव में सामग्री की तुलना करने के मैं ध्यान देने योग्य हूँ:

System.out.println (s1.toString() बराबर (s2.toString())); // लाइन 1

2

StringBuilder कक्षा ओवरराइडन equals() विधि प्रदान नहीं करती है। इस प्रकार, जब उस विधि को StringBuilder के उदाहरण पर बुलाया जाता है, तो StringBuilder extends Object के बाद, विधि के Object वर्ग कार्यान्वयन को निष्पादित किया जाता है।

कि के लिए स्रोत कोड

public boolean equals(Object obj) { 
    return (this == obj); 
} 

जो केवल संदर्भ समानता तुलना है।

2

के लिए अपना पहला जवाब की जांच @abmitchell के जवाब

और अपने संपादित करने के लिए:

जावा स्टिंग में एक वस्तु है और हम जावा में == का उपयोग करके वस्तुओं की तुलना नहीं कर सकते!

== वस्तुओं के लिए प्राइमेटिव की तुलना करने के लिए उपयोग नहीं किया जाता है!

compare Objects करने के लिए हम जावा में equals() का उपयोग

0

StringBuilder और StringBuffer वस्तु class.but स्ट्रिंग के बराबर समारोह पर हावी नहीं बराबरी समारोह को ओवरराइड। वस्तु का कार्य इस

public boolean equals(Object obj) { 
    return (this == obj); 
    } 

आप इस तरह अपने कोड लिख सकता है।

System.out.println(s1.toString() == s2.toString()); 
System.out.println(s1.toString().equals(s2.toString())); 
1

स्ट्रिंगबिल्डर वर्ग में स्ट्रिंग क्लास में समान() फ़ंक्शन का कार्यान्वयन नहीं होता है।

तो यह डिफ़ॉल्ट ऑब्जेक्ट क्लास कार्यक्षमता निष्पादित करता है, जो फिर से केवल पते समकक्षता के लिए जांचता है, जो इस मामले में समान नहीं है। तो यह झूठी प्रिंट करता है।

नोट 1: आप ऑब्जेक्ट्स पर == ऑपरेटर का भी उपयोग कर सकते हैं, लेकिन यह जांचता है कि दोनों ऑब्जेक्ट्स का पता समान है या नहीं।

नोट 2: == ऑपरेटर स्ट्रिंग निरंतर पूल में बनाए गए दो स्ट्रिंग ऑब्जेक्ट्स की तुलना में अच्छी भूमिका निभाता है, यह पता लगाने के लिए कि क्या यह वास्तव में स्ट्रिंग निरंतर पूल में एक नई वस्तु बना रहा है या नहीं।

1

चेक बराबरी विधि का अनुबंध:

यह अनुरूप होना चाहिए (यदि वस्तुओं संशोधित नहीं कर रहे हैं, तो यह एक ही मूल्य लौटने रखना चाहिए)।

यही कारण है कि स्ट्रिंगबिल्डर इसकी सामग्री के बावजूद इसे ओवरराइड नहीं करता है।

चलिए ऊपर उदाहरण लें।

 StringBuilder s1 = new StringBuilder("Test"); 
    StringBuilder s2 = new StringBuilder("Test"); 

शायद, आपको उम्मीद है कि s1.equals (s2) वर्तमान रनटाइम मानों के कारण सत्य लौटाएगा।

लेकिन क्या बारे में अगर आप पंक्ति जोड़ बदलने के लिए:

s1.append("abc"); 

फिर एस 1 और एस 2 अलग स्ट्रिंग सामग्री और s1.equals होगा (s2) झूठे होने की उम्मीद है। लेकिन यह स्थिरता के साथ विरोधाभास में है।

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