Integer i = new Integer(10);
Integer j =10;
System.out.println(i==j); // false
String a1 = new String("abc");
String a2 = "abc";
System.out.println(a1==a2); // false
लेकिन जावा को अधिक मेमोरी कुशल बनाने के लिए, जेवीएममेमोरी के एक विशेष क्षेत्र को अलग करता है जिसे "स्ट्रिंग स्थिर पूल" कहा जाता है। जब संकलक एक स्ट्रिंग शाब्दिक का सामना करता है, तो यह देखने के लिए पूल की जांच करता है कि क्या समान स्ट्रिंग पहले से मौजूद है। यदि कोई मिलान पाया जाता है, तो नए शाब्दिक का संदर्भ मौजूदा स्ट्रिंग को निर्देशित किया जाता है, और कोई नया स्ट्रिंग शाब्दिक ऑब्जेक्ट नहीं बनाया जाता है। (मौजूदा स्ट्रिंग का बस एक अतिरिक्त संदर्भ है।) इसलिए स्ट्रिंग लिटरल्स अपरिवर्तनीय हैं। तो, a1 और a2 दोनों में एक ही मेमोरी लोकेशन की ओर इशारा करते हुए दो संदर्भ होंगे तो क्यों "==" doesn "t रिटर्न सही है?
उत्तर:
जवाब के लिए 2 № 1ऐसा इसलिए होता है क्योंकि a1
शाब्दिक नहीं है। यह एक नया है String
कि आप स्ट्रिंग पूल के बाहर, ढेर पर बनाया है। जिस कंस्ट्रक्टर का आपने वास्तव में उपयोग किया था, उसकी नकल की String
एक नए स्थान पर। हालाँकि, a2
स्ट्रिंग पूल में है।