2013-06-25 12 views
8

में ऑपरेटर यह '+' ऑपरेटर द्वारा दिए गए परिणाम में अंतर के बारे में है। परिणाम स्ट्रिंग शाब्दिक और स्ट्रिंग ऑब्जेक्ट के लिए भिन्न होता है।+ स्ट्रिंग क्लास

String str="ab"; 
String str1="c"; 
String str2 = "ab"+"c"; // Line 3 
String str3 = "abc"; 
String str4 = str+str1; // Line 5 

System.out.println(str2==str3); // True 
System.out.println(str2==str4); // False 
परिणाम हम चाहते हैं कि यह मान सकते हैं शाब्दिक, स्ट्रिंग पूल से पहले से ही उपलब्ध वस्तु के साथ साथ

क्यों यह इतना है लाइन 3 के मामले में और तार के साथ दिया जाता है नई वस्तु वस्तु लाइन 5. के रूप में, दिया जाता है ?

+0

मैं संदर्भित समानता की तुलना कर रहा था इस मामले में। – Prashant

+0

+1, मैं यह भी जानना चाहता हूं कि क्यों, हालांकि मुझे लगता है कि आप इसे लिखते हैं क्योंकि आप अक्षर 4-4 असाइन कर रहे हैं और str4 में concatenation कर रहे हैं मुझे यकीन नहीं है कि क्या एक और कारण है। – Thihara

उत्तर

9

+String एस के लिए ऑप्टरेटर को उस समय के आधार पर अलग-अलग संभाला जाता है जब अभिव्यक्ति का मूल्यांकन किया जा सकता है।

जब अभिव्यक्ति का संकलन समय (जैसे लाइन 3 में) पर मूल्यांकन किया जा सकता है तो संकलक String बना देगा जिसमें केवल संयोजन होगा। इसलिए लाइन 3 में केवल String "एबीसी" बनाया जाएगा और यह String क्लास फ़ाइल में रखा जाएगा। इसलिए str3 और str4 बिल्कुल वही होंगे और इन्हें प्रशिक्षित किया जाएगा।

एक संयोजन है कि केवल रनटाइम पर मूल्यांकन किया जा सकता का उपयोग करते समय (लाइन 5 के रूप में) जिसके परिणामस्वरूप String एक नया String जो equals() wth तुलना में किया जाना चाहिए, क्योंकि यह एक नई वस्तु है।

3

String str2 = "ab"+"c"; इसका मूल्यांकन संकलन पर किया गया है। यह निरंतर पूल पर जाता है, क्योंकि यह पहले से ही कंपाइलर के लिए जाना जाता है।

अन्य का मूल्यांकन रनटाइम पर किया जा सकता है, यह निरंतर पूल का हिस्सा नहीं होगा।

यह है, जहां आप String#concat का उपयोग मामले से अंतर नोट करने के लिए अच्छा अवसर है, तो आप

String str2 = "ab".concat("c");

कर के बाद से स्ट्रिंग अपरिवर्तनीय है, एक नया स्ट्रिंग के कारण str प्रशिक्षु नहीं किया जा करने के लिए concat से दिया जाता है। तो इस मामले में, str2 == str3false होगा।

0

मैंने प्रश्न को डुप्लिकेट के रूप में चिह्नित किया है, लेकिन पाया कि समान उत्तर पोस्ट नहीं किया गया है, इसलिए इसे जाने का विचार किया गया है। अन्य उत्तरों ने पहले ही बताया है कि जवाब गलत क्यों है। लेकिन यहां कुछ ऐसा है जो आपको दिखाता है कि यह कब सच होगा।

यदि आप दूसरी स्ट्रिंग पर intern() पर कॉल करते हैं तो परिणाम true होगा।

यह क्यों काम करता है?

स्मृति को बचाने के लिए (और समानता के लिए परीक्षण तेज करें), जावा स्ट्रिंग्स के "इंटर्निंग" का समर्थन करता है। जब स्ट्रिंग पर intern() विधि लागू की जाती है, तो इंटरनेशनल स्ट्रिंग्स की एक तालिका पर एक लुकअप किया जाता है। यदि एक ही सामग्री के साथ एक स्ट्रिंग ऑब्जेक्ट पहले से ही तालिका में है, तो तालिका में स्ट्रिंग का संदर्भ वापस कर दिया जाता है। अन्यथा, स्ट्रिंग को तालिका में जोड़ा जाता है और इसका संदर्भ वापस कर दिया जाता है।

String str4 = (str+str1).intern(); 

स्पष्ट रूप intern() रिटर्न लागू के लिए एक संदर्भ स्ट्रिंग प्रशिक्षु।

0

जब आप str, str1, str2 और str3 बनायेंगे तो यह एक ही स्ट्रिंग पूल को इंगित करेगा। यहां यह स्ट्रिंग ऑब्जेक्ट नहीं बनाएगा। लेकिन जब आप स्ट्रिंग str4 = str + str1 बनायेंगे। तो str4 का रनटाइम पर मूल्यांकन किया जाता है। इसलिए एक ही स्ट्रिंग पूल का हिस्सा नहीं है जहां सभी अन्य तारों की ओर इशारा किया जाता है। इसलिए str4 झूठी वापसी करता है ..

+0

यह सच नहीं है। उदाहरण के लिए, 'str == str1' 'false' है। अगर वे संकलन समय पर मूल्यांकन कर रहे हैं और उनके समान स्ट्रिंग मान हैं तो वे इंटर्न किए जाएंगे। – Maroun

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