String क्लास का intern() मेथड Java में स्ट्रिंग डुप्लिकेशन समस्याओं से निपटने के लिए उपयोग किया जा सकता है। intern() का उपयोग करके हम डुप्लिकेट स्ट्रिंग इंस्टेंसेस द्वारा खपत की गई बहुत सारी मेमोरी बचा सकते हैं। एक स्ट्रिंग डुप्लिकेट है यदि इसमें另一个 स्ट्रिंग के समान कंटेंट है लेकिन यह अलग मेमोरी लोकेशन्स पर कब्जा कर सकती है।
हम जानते हैं कि JVM परफॉरमेंस के लिए स्ट्रिंग लिटरल्स के लिए एक अलग हीप मेमोरी रखता है। एक बार जब हम स्ट्रिंग लिटरल घोषित करते हैं तो यह इस पूल में जाएगा और यदि दूसरा वेरिएबल उसी लिटरल वैल्यू के साथ असाइन किया जाता है, तो इसे नया ऑब्जेक्ट बनाने और हीप में स्टोर करने के बजाय पूल से पिक किया जाएगा। लेकिन यदि स्ट्रिंग new कंस्ट्रक्टर का उपयोग करके घोषित की जाती है, तो लिटरल पूल में मौजूद होने पर भी एक नया ऑब्जेक्ट बनाया जाएगा। इससे बचने के लिए और JVM को पूल से लिटरल लेने के लिए मजबूर करने के लिए हम intern() मेथड का उपयोग करते हैं।
Java डिफ़ॉल्ट रूप से सभी स्ट्रिंग्स को स्वचालित रूप से इंटर्न करता है। intern() मेथड का उपयोग new String() वाले स्ट्रिंग्स में किया जा सकता है ताकि उनकी तुलना == ऑपरेटर द्वारा की जा सके।
उदाहरण
public class StringInternClassTest {
public static void main(String[] args) {
String s1 = "Tutorix";
String s2 = "Tutorix";
String s3 = new String("Tutorix");
final String s4 = s3.intern();
String s5 = "?Tutorix".substring(1);
String s6 = s5.intern();
System.out.println(s1 == s2);
System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s1 == s5);
System.out.println(s1 == s6);
System.out.println(s1.equals(s2));
System.out.println(s2.equals(s3));
System.out.println(s3.equals(s4));
System.out.println(s1.equals(s4));
System.out.println(s1.equals(s3));
}
}
आउटपुट
true false false false true false true true true true true true
s1 == s2 true (दोनों लिटरल, समान पूल रेफरेंस)। s3.intern() पूल से कैनोनिकल रेफरेंस लौटाता है, इसलिए s1 == s4 true। equals() हमेशा कंटेंट तुलना करता है इसलिए सभी true।