String ক্লাসের intern() মেথড জাভাতে স্ট্রিং ডুপ্লিকেশন সমস্যা সমাধানের জন্য ব্যবহার করা যায়। intern() ব্যবহার করে ডুপ্লিকেট স্ট্রিং ইনস্ট্যান্স দ্বারা ব্যবহৃত অনেক মেমরি বাঁচানো যায়। একটি স্ট্রিং ডুপ্লিকেট যদি এর কন্টেন্ট অন্য স্ট্রিংয়ের সাথে একই হয় কিন্তু ভিন্ন মেমরি লোকেশন ধারণ করে।
আমরা জানি JVM স্ট্রিং লিটারেলের জন্য আলাদা হিপ মেমরি রক্ষা করে পারফরম্যান্সের জন্য। একবার স্ট্রিং লিটারেল ডিক্লেয়ার করলে এটি এই পুল-এ চলে যায় এবং যদি অন্য একটি ভেরিয়েবলে একই লিটারেল মান অ্যাসাইন করা হয়, তবে এটি পুল থেকে নেওয়া হয় নতুন অবজেক্ট তৈরি না করে এবং হিপে সংরক্ষণ না করে। কিন্তু যদি স্ট্রিং new কনস্ট্রাক্টর ব্যবহার করে ডিক্লেয়ার করা হয়, তবে লিটারেল পুলে থাকলেও একটি নতুন অবজেক্ট তৈরি হবে। এটি এড়াতে এবং JVM-কে পুল থেকে লিটারেল নেওয়া বাধ্য করতে intern() মেথড ব্যবহার করা হয়।
জাভা ডিফল্টভাবে সকল স্ট্রিংকে ইন্টার্ন করে। 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