2010-09-11 5 views
9

संभव डुप्लिकेट:
What makes reference comparison (==) work for some strings in Java?'==' जावा स्ट्रिंग्स के लिए .equals के बजाय का उपयोग करना

मैं जानता हूँ कि इस asked before कर दिया गया है, लेकिन सिफारिशों के बावजूद बजाय .equals() उपयोग करने के लिए == तुलना ऑपरेटर, मैंने पाया कि == हर समय काम करता है:

String s1 = "Hello"; 
String s2 = "Hello"; 
System.out.println(s1 == s2); // true 

क्या कोई मुझे == ऑपरेटर का एक उदाहरण दे सकता है?

+0

मार्कोस ने आपके द्वारा जुड़े प्रश्न के उत्तर में एक [अच्छा उदाहरण] (http://stackoverflow.com/questions/767372/java-string-equals-versus/1251721#1251721) प्रदान किया। –

+0

संबंधित: http://stackoverflow.com/questions/9698260/what-makes-reference-comparison-work-for-some-strings-in-java/9698305#9698305 – berry120

उत्तर

37

इसका कारण यह है कि आप भाग्यशाली हैं। जावा में == ऑपरेटर संदर्भ समानता के लिए जांच करता है: यदि पॉइंटर्स समान हैं तो यह सच हो जाता है। यह सामग्री समानता की जांच नहीं करता है। संकलन-समय पर पाए गए समान तार एक String उदाहरण में ध्वस्त हो गए हैं, इसलिए यह String अक्षरों के साथ काम करता है, लेकिन रनटाइम पर उत्पन्न तारों के साथ नहीं।

उदाहरण के लिए, "Foo" == "Foo" काम हो सकता है, लेकिन "Foo" == new String("Foo") नहीं होगा, क्योंकि new String("Foo") एक नया String उदाहरण बनाता है, और किसी भी संभव सूचक समानता टूट जाता है।

अधिक महत्वपूर्ण बात, अधिकतरStrings आप वास्तविक दुनिया प्रोग्राम में सौदा करते हैं रनटाइम-जेनरेटेड होते हैं। टेक्स्ट बॉक्स में उपयोगकर्ता इनपुट रनटाइम-जेनरेट किया गया है। सॉकेट के माध्यम से प्राप्त संदेश रनटाइम-जनरेटेड होते हैं। फ़ाइल से पढ़ा गया सामान रनटाइम-जेनरेट किया गया है। इसलिए यह बहुत महत्वपूर्ण है कि आप equals विधि का उपयोग करें, और == ऑपरेटर नहीं, यदि आप सामग्री समानता की जांच करना चाहते हैं।

String s1 = "Hello"; 
String s2 = "Hello"; 

संकलक समान स्ट्रिंग शाब्दिक पाता है और फिर ढेर बिंदु में ढेर में एक उदाहरण रखने और सभी चर बनाकर अनुकूलन कर:

+3

एक अतिरिक्त ध्यान दें, कारण "foo" == "foo" वास्तव में काम करता है, के बारे में थोड़ी क्योंकि सभी शाब्दिक तार http प्रशिक्षु रहे हैं: // डाउनलोड .oracle.com/javase/1.4.2/docs/api/java/lang/String.html # intern() –

9

क्या कोई मुझे == ऑपरेटर विफल करने का उदाहरण दे सकता है?

उदाहरण 1:

String s1 = new String("Hello"); 
String s2 = new String("Hello"); 
System.out.println(s1 == s2); // false 

उदाहरण 2:

Integer a=1000,b=1000; 
System.out.println(a == b); // false 
+1

मान लें कि काम करेगा। लेकिन स्ट्रिंग्स अपरिवर्तनीय नहीं हैं? ऐसे में, उन्हें प्रशिक्षित नहीं किया जाना चाहिए? – Aillyn

+0

शाब्दिक तारों को प्रशिक्षित किया जाता है। –

+1

"हैलो" == "हैलो" ==> सत्य। हालांकि, नई स्ट्रिंग ("हैलो") किसी ऑब्जेक्ट के लिए कुछ मेमोरी आवंटित करेगी, और एक ही चीज फिर से किसी अन्य ऑब्जेक्ट के लिए कुछ और स्मृति आवंटित करेगी। चूंकि "==" ऑपरेटर संदर्भों की तुलना करता है, यह झूठी वापसी करेगा। –

4

जब आप ऐसा करते हैं, तो आप वास्तव में स्ट्रिंग शाब्दिक पैदा कर रहे इसके लिए तो == कर सच हो जाएगा क्योंकि वे एक ही स्मृति पते को इंगित करते हैं।

जब आप ऐसा करते हैं, तो आप स्ट्रिंग पैदा कर रहे वस्तुओं:

String s1 = new String("Hello"); 
String s2 = new String("Hello"); 

इन्स्टेन्शियशन इन और ढेर चर से प्रत्येक के लिए ढेर पर अद्वितीय अंतरिक्ष पैदा करेगा उन अलग-अलग स्थानों को इंगित करेंगे। इस प्रकार, ये .equals() का उपयोग करके बराबर होंगे क्योंकि उनके मान समान हैं, लेकिन वे == का उपयोग करके बराबर नहीं होंगे क्योंकि वे ढेर मेमोरी स्पेस में अलग-अलग ऑब्जेक्ट्स हैं।

4

अनुभवी जावा डेवलपर्स शायद ही कभी new String(String) का उपयोग करते हैं, लेकिन समस्या अन्य मामलों में भी उत्पन्न होती है। उदाहरण के लिए:

String hello = "Hello" 
String hell = hello.substring(0, 4); 
System.err.println("Hell" == hell); // should print "false". 

(एक वास्तविक दुनिया अनुप्रयोगों में अधिकांश स्ट्रिंग उदाहरणों या तो कुछ अन्य स्ट्रिंग की सबस्ट्रिंग लेने के द्वारा, या वर्ण की एक सरणी से यह निर्माण करके बनते हैं बहुत कुछ अनुप्रयोगों केवल स्ट्रिंग उदाहरणों का प्रयोग करेंगे। अक्षर के रूप में बनाया गया।)

+1

"y = new string (x)" (जहां x एक स्ट्रिंग है) का उपयोग करने का एक कारण है अनुमति देना है कचरा संग्रह, जब एक्स एक बहुत बड़ी स्ट्रिंग का एक सबस्ट्रिंग है। यदि आप बस "y = x" का उपयोग करते हैं तो बहुत बड़ी स्ट्रिंग को जब तक संदर्भित किया जाता है तब तक कचरा नहीं मिल सकता है। यदि आप "नई स्ट्रिंग (x)" का उपयोग करते हैं तो एक नई स्ट्रिंग बनाई गई है जो मूल बड़ी स्ट्रिंग का संदर्भ नहीं देती है। –

+4

यह सच है, लेकिन मेरे अनुभव में यह शायद ही कभी जरूरी है। और यदि यह आवश्यक नहीं है, तो यह वास्तव में एक विरोधी अनुकूलन है। –

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