JLS
জেএলএস 7 3.10.5 এটি সংজ্ঞায়িত করে এবং একটি ব্যবহারিক উদাহরণ দেয়:
তদুপরি, একটি স্ট্রিং আক্ষরিক সর্বদা স্ট্রিং শ্রেণীর একই উদাহরণকে বোঝায়। স্ট্রিং লিটারেলগুলি - বা আরও সাধারণভাবে যে স্ট্রিংগুলি ধ্রুবক এক্সপ্রেশনগুলির মান (.215.28) --গুলি স্ট্রিং ইন্টার্নটার্ন ব্যবহার করে অনন্য দৃষ্টান্ত ভাগ করে নেওয়ার জন্য "ইন্টার্নড" করা হয়।
উদাহরণ 3.10.5-1। স্ট্রিং লিটারালস
সংকলন ইউনিট (§7.3) সমন্বিত প্রোগ্রাম:
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
এবং সংকলন ইউনিট:
package other;
public class Other { public static String hello = "Hello"; }
আউটপুট উত্পাদন করে:
true true true true false true
JVMS
জেভিএমএস 7 5.1 বলেছেন যে ইন্টার্নিং একটি উত্সর্গীকৃত কাঠামোর সাথে যাদু এবং দক্ষতার সাথে প্রয়োগ করা হয়েছে CONSTANT_String_info
(অন্যান্য জেনারেল উপস্থাপনাগুলির মধ্যে অন্যান্য বিষয়গুলির তুলনায়):
স্ট্রিং আক্ষরিক একটি ক্লাস স্ট্রিংয়ের উদাহরণের জন্য একটি উল্লেখ, এবং এটি একটি শ্রেণি বা ইন্টারফেসের বাইনারি উপস্থাপনায় একটি CONSTANT_String_info কাঠামো (.44.4.3) থেকে প্রাপ্ত। CONSTANT_String_info কাঠামোটি ইউনিকোড কোড পয়েন্টগুলির ক্রম দেয় যা স্ট্রিংকে আক্ষরিক গঠন করে।
জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজের জন্য অনুরূপ স্ট্রিং লিটারালগুলি (এটি হল যে কোডাল পয়েন্টগুলির একই ক্রমযুক্ত লিটারালগুলি) অবশ্যই স্ট্রিংয়ের (জেএলএস §3.10.5) শ্রেণির একই উদাহরণটি বোঝায়। এছাড়াও, স্ট্রিং.ইন্টার্ন পদ্ধতিটি যদি কোনও স্ট্রিংয়ে ডাকা হয়, ফলাফলটি একই শ্রেণীর উদাহরণের একটি উল্লেখ যা সেই স্ট্রিংটি আক্ষরিক হিসাবে উপস্থিত হলে ফিরে আসবে। সুতরাং, নিম্নলিখিত অভিব্যক্তিটির মানটি সত্য হতে হবে:
("a" + "b" + "c").intern() == "abc"
একটি স্ট্রিং আক্ষরিক পেতে, জাভা ভার্চুয়াল মেশিন CONSTANT_String_info কাঠামো দ্বারা প্রদত্ত কোড পয়েন্টগুলির ক্রম পরীক্ষা করে।
যদি স্ট্রিং.ইনটার্ন মেথডটি পূর্বে ইউনিকোড কোড পয়েন্টের ক্রমযুক্ত স্ট্রিংয়ের উদাহরণ হিসাবে ডাকা হত যা CONSTANT_String_info কাঠামোর অনুরূপ, তবে স্ট্রিং আক্ষরিক ডেরিভেশন ফলাফল স্ট্রিংয়ের একই উদাহরণের একটি রেফারেন্স।
অন্যথায়, ক্লাস স্ট্রিংয়ের একটি নতুন উদাহরণ তৈরি করা হয়েছে যা ইউনিকোড কোড পয়েন্টের ক্রম সহ CONSTANT_String_info কাঠামো দ্বারা প্রদত্ত; এই শ্রেণীর উদাহরণের জন্য একটি রেফারেন্স স্ট্রিং আক্ষরিক ডেরাইভেশনের ফলাফল। শেষ অবধি, নতুন স্ট্রিং ইনস্ট্যান্সের ইন্টার্ন পদ্ধতিটি চাওয়া হয়েছে।
বাইটকোড
কর্মের অভ্যন্তরীণ অংশটি দেখতে কিছু ওপেনজেডকে 7 বাইটকোডটি সঙ্কলন করা যাক।
যদি আমরা পচন করি:
public class StringPool {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
System.out.println(a);
System.out.println(b);
System.out.println(a == c);
}
}
আমাদের ধ্রুবক পুলটিতে রয়েছে:
#2 = String #32 // abc
[...]
#32 = Utf8 abc
এবং main
:
0: ldc #2 // String abc
2: astore_1
3: ldc #2 // String abc
5: astore_2
6: new #3 // class java/lang/String
9: dup
10: ldc #2 // String abc
12: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
15: astore_3
16: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
19: aload_1
20: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
23: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
26: aload_2
27: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
33: aload_1
34: aload_3
35: if_acmpne 42
38: iconst_1
39: goto 43
42: iconst_0
43: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V
কিভাবে নোট করুন:
0
এবং 3
: একই ldc #2
ধ্রুবক লোড করা হয় (আক্ষরিক)
12
: একটি নতুন স্ট্রিং উদাহরণ তৈরি করা হয়েছে ( #2
যুক্তি হিসাবে)
35
: a
এবং c
এর সাথে নিয়মিত বস্তু হিসাবে তুলনা করা হয়if_acmpne
ধ্রুব স্ট্রিংগুলির উপস্থাপনা বাইটকোডে বেশ জাদুযুক্ত:
এবং উপরের জেভিএমএসের উদ্ধৃতিটি বলে মনে হচ্ছে যে যখনই ইউটিএফ 8 একই হয়, তখন অভিন্ন উদাহরণগুলি লোড হয় ldc
।
আমি ক্ষেত্রগুলির জন্য একই রকম পরীক্ষা করেছি এবং:
static final String s = "abc"
কনস্ট্যান্টভ্যালু অ্যাট্রিবিউটের মাধ্যমে ধ্রুবক টেবিলের দিকে নির্দেশ করে
- চূড়ান্ত নয় এমন ক্ষেত্রগুলিতে সেই বৈশিষ্ট্য নেই, তবে এটি দিয়ে এখনও আরম্ভ করা যেতে পারে
ldc
উপসংহার : স্ট্রিং পুলের জন্য সরাসরি বাইটকোড সমর্থন রয়েছে এবং মেমরির উপস্থাপনা দক্ষ।
বোনাস: এটি ইন্টিজার পুলের সাথে তুলনা করুন , যার সরাসরি বাইটকোড সমর্থন নেই (যেমন কোনও CONSTANT_String_info
এনালগ নেই)।