1) ऐसा इसलिए है क्योंकि स्ट्रिंग ऑब्जेक्ट्स अपरिवर्तनीय हैं। एक बार जब आप स्ट्रिंग ऑब्जेक्ट बनाते हैं और इसे मान देते हैं, तो उसके पास वही मान हमेशा के लिए होता है जिसे बदला नहीं जा सकता है। इस प्रकार जब आप इसके साथ कोई संचालन करते हैं (उदाहरण के लिए शामिल हो) तो हमेशा एक नया स्ट्रिंग ऑब्जेक्ट बनाया गया है।
ढेर में इसका एक विशेष हिस्सा है जो स्ट्रिंग स्थिरांक के लिए पूल के रूप में कार्य करता है। यदि कंपाइलर स्ट्रिंग शाब्दिक से मुकाबला करता है, तो यह पहले स्मृति के इस भाग को देखता है चाहे समान वस्तु (स्ट्रिंग) पहले से मौजूद है। यदि ऐसा होता है, तो यह एक नया निर्माण करने के बजाय इस पहले से मौजूद ऑब्जेक्ट (स्ट्रिंग) का संदर्भ निर्दिष्ट करता है। (यह कारण है कि स्ट्रिंग रों अपरिवर्तनीय हैं, इसलिए कोई भी। इसे बदल सकते हैं क्योंकि अगर कई संदर्भ इस स्ट्रिंग को इंगित होता है और उनमें से एक अपने मूल्य बदल जाएगा, यह एक गड़बड़ पैदा करेगा।)
अब देखते हैं कि इस कोड स्निपेट में क्या हो रहा है और एक बार में अपने दोनों सवालों के जवाब खोजने का प्रयास करें।
(1) String a="hello"+"world"; //line 1
(2) String b="hello"; // now b is a literal
(3) String c="world";
(4) String d=b+c;
(5) String e="helloworld";
(6) System.out.println(e==a);
(7) System.out.println(a==d);
(1) पहले वहाँ एक संदर्भ मूल्य एक कि स्ट्रिंग टाइप करने के लिए कहते हैं बनाया जाता है। इसके बाद पहले उल्लेख किए गए ढेर में इस विशेष पूल में शाब्दिक "हैलो" बनाया गया है (पहली स्ट्रिंग ऑब्जेक्ट)। फिर पूल में शाब्दिक "दुनिया" बनाया गया है (द्वितीय स्ट्रिंग ऑब्जेक्ट)। फिर, चूंकि स्ट्रिंग्स अपरिवर्तनीय हैं, इस पूल में "helloworld" में एक और शाब्दिक बनाया गया है और इसे इस संदर्भ चर (तृतीय स्ट्रिंग ऑब्जेक्ट - यह आपके प्रश्न का उत्तर है। 2)।
(2) पूल में "हैलो" और "दुनिया" बनाए गए (1) पूल में बनाए गए थे और किसी भी संदर्भ मूल्य को असाइन नहीं किए गए थे, लेकिन वे इस पूल में मौजूद हैं। इस पंक्ति में स्ट्रिंग बी प्रकार का संदर्भ चर है और इसे पूल में मौजूद इस शाब्दिक "हैलो" को असाइन किया गया है।
(3) (2)
(4) बनाया गया संदर्भ प्रकार स्ट्रिंग घ का मूल्य के रूप में ही। यद्यपि पहले से ही स्ट्रिंग मूल्य "helloworld" के साथ इस विशेष ढेर भाग (पूल) में शाब्दिक है, मूल्य "helloworld" के साथ नई स्ट्रिंग ऑब्जेक्ट को ढेर में बनाया गया है - जिसका अर्थ है ढेर के गैर-पूल हिस्से में। इसलिए आपके पास स्ट्रिंग के दो अलग-अलग ऑब्जेक्ट्स हैं, "helloworld" (पूल में एक और दूसरा ढेर के गैर-पूल हिस्से में) के साथ। यदि आप अब == ऑपरेटर संदर्भ मानों की तुलना और डी से तुलना करते हैं, तो दोनों अलग-अलग ऑब्जेक्ट्स को इंगित करते हैं (हालांकि समान मान के साथ, विधि विधि बराबर सच हो जाएगी)।
(5) स्ट्रिंग प्रकार के संदर्भ मूल्य ई बनाया गया। ढेर के पूल हिस्से में पहले से ही एक स्ट्रिंग "helloworld" है (हमने इसे (1) में बनाया है और इसे संदर्भ चर पर इंगित किया है) इसलिए संदर्भ चर ई इस ऑब्जेक्ट को असाइन किया गया है। और के समान स्थान पर इंगित करता है। इसलिए यदि आप एक == ई संदर्भों की तुलना करते हैं तो आप सच हो जाते हैं।एक ही विधि के लिए किया जाएगा के बराबर होती है
(6) और (7) पिछले अंक में विस्तार से बताया गया
TLDR:
1) क्योंकि यह एक ही वस्तु
2) 3
नहीं है
डी 'c + b' का एक संदर्भ वस्तु है .. और नहीं 'ए + बी' – Rishabh
उत्तर अपडेट किया गया। –
@ सुमित मुझे लाइन 1 के आंतरिक प्रतिनिधित्व में एक और संदेह है। क्या लाइन 1 का आंतरिक प्रतिनिधित्व नया स्ट्रिंगबिल्डर ("हैलो") है। संलग्न करें ("दुनिया")। ToString()? – nantitv