/ / स्ट्रिंग # इंटर्न के परिणाम के बारे में भ्रमित - java, string, jvm

स्ट्रिंग # इंटर्न इंटर्न - जावा, स्ट्रिंग, जेवीएम के परिणाम के बारे में उलझन में है

public class Main {
public static void main(String[] args) {
String a = new String("11") ;
a.intern();
String b = "11";
System.out.println(a == b);                  // false

String c = new String("2") + new String("2");
c.intern();
String d = "22";
System.out.println(c == d);                  // true
}
}

प्रिंट:

false
true

मैं इसे jkd 1.8 पर चलाता हूं। मैं बहुत उलझन में था कि दूसरा प्रिंटल क्यों परिणाम देता है।

उत्तर:

जवाब के लिए 3 № 1

String शाब्दिक हमेशा पहली बार प्रकट होने पर स्वचालित रूप से इंटर्न किया जाता है। String आपके पास अपने कोड में "11" और "2" हैं।

दूसरी तरफ, String के परिणामस्वरूप बनाया गया String संघनन स्वचालित रूप से नजरबंद नहीं है।

String a = new String("11"); // interns the String literal "11", and creates a
// different String instance referenced by a
a.intern(); // doesn"t add a to the String pool, since "11" is already in
// the String pool
String b = "11"; // "11" returns the canonical instance already in the pool,
// which is != a

इसलिये a != b.

String c = new String("2") + new String("2"); // interns the String "2", creates 2
// more Strings having the same value,
// and creates an additional String
// whose value is "22", which is not
// interned yet
c.intern(); // c is added to the String pool as the canonical instance whose value
// is "22"
String d = "22"; // "22" returns the canonical instance already in the pool,
// which is == c

इसलिये c == d.

उपरोक्त सभी के Javadoc से अनुसरण करता है intern:

स्ट्रिंग ऑब्जेक्ट के लिए एक विहित प्रतिनिधित्व लौटाता है।

स्ट्रिंग्स का एक पूल, जो शुरू में खाली था, को निजी तौर पर क्लास स्ट्रिंग द्वारा बनाए रखा जाता है।

जब इंटर्न विधि को लागू किया जाता है, यदि पूल में पहले से ही स्ट्रिंग स्ट्रिंग के बराबर स्ट्रिंग ऑब्जेक्ट (ऑब्जेक्ट) विधि द्वारा निर्धारित है, तो पूल से स्ट्रिंग वापस आ गई है। अन्यथा, इस स्ट्रिंग ऑब्जेक्ट को पूल में जोड़ा जाता है और इस स्ट्रिंग ऑब्जेक्ट के लिए एक संदर्भ दिया जाता है।

यह अनुसरण करता है कि किसी भी दो तार के लिए s और t, s.intern () == t.intern () सत्य है यदि और केवल यदि s.equals (t) सत्य है।

सभी शाब्दिक तार और स्ट्रिंग-मूल्यवान स्थिर अभिव्यक्ति को नजरबंद किया जाता है। स्ट्रिंग ™ को जावा ™ भाषा विनिर्देश के खंड 3.10.5 में परिभाषित किया गया है।