জাভা স্ট্রিং ইন্টার্নিং কি?


234

জাভাতে স্ট্রিং ইন্টার্নিং কী , কখন আমার এটি ব্যবহার করা উচিত এবং কেন ?



2
যদি String a = new String("abc"); String b = new String("abc"); তা হয়a.intern() == b.intern()
আসঙ্কা সিরিওয়ার্দেনা


এর String.intern()উপর নির্ভর করে ClassLoader, অর্থ, বিভিন্ন শ্রেণীবদ্ধার কি "বিভিন্ন" Stringগুলি তৈরি করে , বিভিন্ন কারণে সৃষ্টি করে intern?
অ্যালিকেলিন-কিলাকা

1
@ অ্যালিক্লিজিন-কিলাকা নং, শ্রেণিবদ্ধরা স্ট্রিং ইন্টার্নিংয়ের জন্য সম্পূর্ণ অপ্রাসঙ্গিক। পরের বার আপনার কোনও প্রশ্ন থাকলে দয়া করে অন্য কোনও প্রশ্নের মন্তব্য হিসাবে পোস্ট করার পরিবর্তে একটি নতুন প্রশ্ন খুলুন
হোলার

উত্তর:


233

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern ()

মূলত স্ট্রিং.ইনটার্ন () স্ট্রিংয়ের একটি সিরিজে করা নিশ্চিত করবে যে একই বিষয়বস্তুযুক্ত সমস্ত স্ট্রিং একই মেমরির ভাগ করে। সুতরাং আপনার যদি এমন নামের তালিকা থাকে যেখানে 'জন' 1000 বার প্রদর্শিত হয়, ইন্টার্নিংয়ের মাধ্যমে আপনি নিশ্চিত করুন যে কেবলমাত্র একটি 'জন' আসলে মেমরি বরাদ্দ করা হয়েছে।

আপনার প্রোগ্রামটির মেমরির প্রয়োজনীয়তাগুলি হ্রাস করতে এটি কার্যকর হতে পারে। তবে জেনে রাখুন যে স্থায়ী মেমরি পুলে জেভিএম দ্বারা ক্যাশে রক্ষণাবেক্ষণ করা হয় যা সাধারণত গাদা তুলনায় আকারে সীমাবদ্ধ থাকে তাই আপনার যদি খুব বেশি নকল মান না থাকে তবে আপনি ইন্টার্ন ব্যবহার করবেন না।


ইন্টার্ন () ব্যবহারের স্মৃতি সীমাবদ্ধতার বিষয়ে আরও

একদিকে, এটি সত্য যে আপনি স্ট্রিং সদৃশগুলিকে অভ্যন্তরীণ করে মুছে ফেলতে পারেন। সমস্যাটি হ'ল অভ্যন্তরীণ স্ট্রিংগুলি স্থায়ী জেনারেশনে চলে যায়, এটি জেভিএম-এর এমন একটি অঞ্চল যা ক্লাস, পদ্ধতি এবং অন্যান্য অভ্যন্তরীণ জেভিএম বস্তুর মতো অ ব্যবহারকারী ব্যবহারকারীর জন্য সংরক্ষিত। এই অঞ্চলের আকার সীমাবদ্ধ এবং সাধারণত গাদা থেকে অনেক ছোট। স্ট্রিনে ইন্টার্ন () কল করার ফলে এটি গাদা থেকে স্থায়ী প্রজন্মের দিকে সরিয়ে যাওয়ার প্রভাব পড়ে এবং আপনি পারমজেনের স্থান ছাড়িয়ে যাওয়ার ঝুঁকিপূর্ণ।

- থেকে: http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html


জেডিকে From (হটস্পট মানে) থেকে কিছু পরিবর্তন হয়েছে something

জেডিকে In-তে, জাভা স্তূপের স্থায়ী প্রজন্মের অভ্যন্তরীণ স্ট্রিংগুলি আর বরাদ্দ করা হয় না, তবে পরিবর্তে জাভা হিপগুলির মূল অংশে বরাদ্দ করা হয় (তরুণ এবং পুরাতন প্রজন্ম হিসাবে পরিচিত), অ্যাপ্লিকেশন দ্বারা নির্মিত অন্যান্য বস্তুর পাশাপাশি । এই পরিবর্তনের ফলে মূল জাভা হিপগুলিতে আরও বেশি ডেটা থাকবে এবং স্থায়ী প্রজন্মের মধ্যে কম ডেটা হবে এবং ফলস্বরূপ হিপ মাপগুলি সামঞ্জস্য করতে হতে পারে। বেশিরভাগ অ্যাপ্লিকেশনগুলি এই পরিবর্তনের কারণে গাদা ব্যবহারের ক্ষেত্রে কেবল তুলনামূলকভাবে ছোট পার্থক্য দেখতে পাবে, তবে বৃহত্তর অ্যাপ্লিকেশনগুলি যেগুলি অনেক ক্লাস লোড করে বা স্ট্রিং ইন্টেন্টার্ন () পদ্ধতির ভারী ব্যবহার করে, আরও তাত্পর্যপূর্ণ পার্থক্য দেখতে পাবে।

- জাভা এসই 7 বৈশিষ্ট্য এবং বর্ধন থেকে

আপডেট: অভ্যন্তরীণ স্ট্রিংগুলি জাভা 7 এর পরে প্রধান গাদাতে সংরক্ষণ করা হয়। http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#jdk7changes


1
"তবে সচেতন থাকুন যে জেভিএম স্থায়ী মেমরি পুলে ক্যাশে রক্ষণাবেক্ষণ করে যা সাধারণত আকারে সীমাবদ্ধ থাকে ......" আপনি কি এটি ব্যাখ্যা করতে পারবেন? আমি বুঝতে পারি নি
saplingPro

2
"ইন্টার্নড" স্ট্রিংগুলি জেভিএম-এর একটি বিশেষ মেমরি অঞ্চলে সংরক্ষণ করা হয়। এই মেমরি অঞ্চলে সাধারণত একটি নির্দিষ্ট আকার থাকে এবং এটি নিয়মিত জাভা হ্যাপের অংশ নয় যেখানে অন্যান্য ডেটা সঞ্চিত থাকে। স্থির আকারের কারণে, এটি ঘটতে পারে যে এই স্থায়ী স্মৃতি অঞ্চলটি আপনার সমস্ত স্ট্রিংয়ে পূর্ণ হয়ে যায়, ফলে কুৎসিত সমস্যা দেখা দেয় (ক্লাসগুলি লোড করা যায় না এবং অন্যান্য স্টাফও করা যায় না)।
সেলো

@ এসেলো তাই, এটি কি ক্যাচিংয়ের মতো?
রোপণপ্রো

8
@ গ্রাসপ্রো: হ্যাঁ, এটি এক ধরণের ক্যাচিং, এটি জেভিএম স্থানীয়ভাবে সরবরাহ করে। একটি দ্রষ্টব্য হিসাবে, সান / ওরাকল জেভিএম এবং জারোকিতের একত্রিত হওয়ার কারণে, জেভিএম ইঞ্জিনিয়াররা জেডিকে 8 ( ওপেনড্যাড.জ্যাভ.नेट / জেপস / 122 ) এ স্থায়ী মেমরি অঞ্চলটি থেকে মুক্তি পাওয়ার চেষ্টা করে , সুতরাং সেখানে থাকবে না ভবিষ্যতে কোনও আকার সীমাবদ্ধতা।
সেলো

9
প্রোগ্রামারদের এও সচেতন হওয়া উচিত যে স্ট্রিং ইন্টার্নিংয়ের সুরক্ষা সম্পর্কিত প্রভাব থাকতে পারে। আপনার যদি মেমরির স্ট্রিংয়ের মতো পাসওয়ার্ডের মতো সংবেদনশীল পাঠ্য থাকে তবে প্রকৃত স্ট্রিং অবজেক্টগুলি দীর্ঘ সময় ধরে GC'd হয়ে থাকলেও এটি মেমরিতে খুব দীর্ঘ সময়ের জন্য থাকতে পারে। খারাপ লোকেরা যদি কোনওভাবে মেমরির ডাম্পের অ্যাক্সেস পায় তবে তা সমস্যাজনক হতে পারে। ইন্টার্নিং ছাড়াই এই সমস্যাটি বিদ্যমান রয়েছে (যেহেতু জিসি ইত্যাদির সাথে শুরু করার জন্য অ-নিরস্তাবোধক) তবে এটি কিছুটা আরও খারাপ করে তোলে। সংবেদনশীল পাঠ্যের char[]পরিবর্তে এটি ব্যবহার করা ভাল Stringand
ক্রিস

71

কিছু "আকর্ষণীয় সাক্ষাত্কার" প্রশ্ন রয়েছে যেমন আপনি কেন সমান হন! আপনি যদি নীচের কোডটির টুকরা কার্যকর করেন।

String s1 = "testString";
String s2 = "testString";
if(s1 == s2) System.out.println("equals!");

আপনি যদি স্ট্রিংগুলির তুলনা করতে চান তবে আপনার ব্যবহার করা উচিত equals()। উপরেরটি সমান মুদ্রণ করবে কারণ এটি testStringইতিমধ্যে সংকলক দ্বারা আপনার জন্য ইন্টার্ন করা হয়েছে। পূর্ববর্তী উত্তরে যেমন দেখানো হয়েছে তেমন ইন্টার্ন পদ্ধতি ব্যবহার করে আপনি নিজেই স্ট্রিংগুলি ইন্টার্ন করতে পারেন ....


5
আপনার উদাহরণটি জটিল কারণ এটি আপনি যদি equalsপদ্ধতিটি ব্যবহার করেন তবে একই মুদ্রণের ফলাফল হবে । আপনি new String()আরও স্পষ্টভাবে পার্থক্য দেখানোর জন্য একটি তুলনা যুক্ত করতে চাইতে পারেন ।
জিয়ানিস ক্রিস্টোফাকিস

@ গ্রেইনিসক্রিস্টোফাকিস তবে আমরা যদি নতুন স্ট্রিং () ব্যবহার করি তবে == ব্যর্থ হবে না? জাভা কি স্বয়ংক্রিয়ভাবে নতুন স্ট্রিংগুলিকে অভ্যন্তরীণ করে তোলে?
দীপক সেলককুমার

@ জিগনিশ্রিস্টোফাকিস অবশ্যই আপনি যদি নতুন স্ট্রিং () ব্যবহার করেন তবে এটি == এ ব্যর্থ হবে। তবে নতুন স্ট্রিং (...)। ইন্টার্ন () == এ ব্যর্থ হবে না কারণ ইন্টার্ন একই স্ট্রিংটি ফিরে আসবে। সাধারণ অনুমান সংকলক নতুন স্ট্রিং ()
আক্ষরিক

42

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এনালগ নেই)।


19

জাভা 8 বা প্লাসের জন্য আপডেট । জাভা 8-তে, পারমজেন (স্থায়ী জেনারেশন) স্থানটি मेटाটা স্পেস দ্বারা প্রতিস্থাপন করা হবে এবং প্রতিস্থাপন করা হবে। স্ট্রিং পুল মেমরিটি জেভিএমের হিপে সরে গেছে।

জাভা 7 এর সাথে তুলনা করে, স্ট্রিং পুলের আকারটি গাদা হয়ে বেড়েছে। অতএব, আপনার অভ্যন্তরীণ স্ট্রিংগুলির জন্য আরও জায়গা রয়েছে তবে পুরো অ্যাপ্লিকেশনটির জন্য আপনার কাছে কম স্মৃতি রয়েছে।

আরও একটি জিনিস, আপনি ইতিমধ্যে জেনে গেছেন যে জাভাতে 2 ( ==রেফারেন্স) অবজেক্টের তুলনা করার সময় ' equals' অবজেক্টের রেফারেন্স তুলনা করার জন্য ব্যবহৃত হয়, ' ' অবজেক্টের বিষয়বস্তুর তুলনা করার জন্য ব্যবহৃত হয়।

আসুন এই কোডটি পরীক্ষা করুন:

String value1 = "70";
String value2 = "70";
String value3 = new Integer(70).toString();

ফলাফল:

value1 == value2 ---> সত্য

value1 == value3 ---> মিথ্যা

value1.equals(value3) ---> সত্য

value1 == value3.intern() ---> সত্য

এজন্য আপনার equalsদুটি স্ট্রিং অবজেক্টের তুলনা করতে ' ' ব্যবহার করা উচিত । এবং এটি কিভাবে intern()দরকারী।


2

স্ট্রিং ইন্টার্নিং সংকলক দ্বারা একটি অপ্টিমাইজেশন কৌশল। আপনার যদি একটি সংকলনের ইউনিটে দুটি অভিন্ন স্ট্রিং অক্ষর থাকে তবে উত্পন্ন কোডটি নিশ্চিত করে যে সমাবেশের মধ্যে সমস্ত আক্ষরিক (ডাবল উদ্ধৃতিতে আবদ্ধ অক্ষর) সমস্ত উদাহরণের জন্য কেবল একটি স্ট্রিং অবজেক্ট তৈরি হয়েছে।

আমি সি # ব্যাকগ্রাউন্ড থেকে এসেছি, তাই আমি এর থেকে উদাহরণ দিয়ে ব্যাখ্যা করতে পারি:

object obj = "Int32";
string str1 = "Int32";
string str2 = typeof(int).Name;

নিম্নলিখিত তুলনা আউটপুট:

Console.WriteLine(obj == str1); // true
Console.WriteLine(str1 == str2); // true    
Console.WriteLine(obj == str2); // false !?

নোট 1 : বিষয়গুলি রেফারেন্সের সাথে তুলনা করা হয়।

নোট 2 : টাইপফ (ইনট) ame নামটি প্রতিবিম্বের পদ্ধতি দ্বারা মূল্যায়ন করা হয় তাই এটি সংকলন সময়ে মূল্যায়ন হয় না। এখানে এই তুলনাগুলি সংকলন সময়ে করা হয়।

ফলাফলগুলির বিশ্লেষণ: 1) সত্য কারণ এগুলি উভয়ই একই আক্ষরিক ধারণ করে এবং তাই উত্পন্ন কোডটিতে কেবল "ইন্টার 32" উল্লেখ করে কেবল একটি অবজেক্ট থাকবে। নোট 1 দেখুন

2) সত্য কারণ উভয় মানের কন্টেন্ট একই যা একই পরীক্ষা করা হয়।

3) মিথ্যা কারণ str2 এবং আপত্তি একই আক্ষরিক হয় না। নোট 2 দেখুন ।


3
এটি তার চেয়েও শক্তিশালী। একই ক্লাসলোডার দ্বারা লোড হওয়া যে কোনও স্ট্রিং আক্ষরিক একই স্ট্রিংকে উল্লেখ করবে। জেএলএস এবং জেভিএম স্পেসিফিকেশন দেখুন।
লার্নের মারকুইস

1
@ ইউজার ২০21৪২২ বাস্তবে, এটি শ্রেণিবদ্ধের সাথে স্ট্রিং আক্ষরিক অন্তর্ভুক্ত তা অপ্রাসঙ্গিক।
হলগার

1
Java interning() method basically makes sure that if String object is present in SCP, If yes then it returns that object and if not then creates that objects in SCP and return its references

for eg: String s1=new String("abc");
        String s2="abc";
        String s3="abc";

s1==s2// false, because 1 object of s1 is stored in heap and other in scp(but this objects doesn't have explicit reference) and s2 in scp
s2==s3// true

now if we do intern on s1
s1=s1.intern() 

//JVM checks if there is any string in the pool with value “abc” is present? Since there is a string object in the pool with value “abc”, its reference is returned.
Notice that we are calling s1 = s1.intern(), so the s1 is now referring to the string pool object having value abc”.
At this point, all the three string objects are referring to the same object in the string pool. Hence s1==s2 is returning true now.

0

ওসিপি জাভা এসই 11 প্রোগ্রামার দেশমুখ বইটি থেকে আমি ইন্টার্নিংয়ের সবচেয়ে সহজ ব্যাখ্যাটি অনুসরণ করেছি যা অনুসরণ করা হয়েছে: যেহেতু স্ট্রিংগুলি বস্তু এবং জাভাতে সমস্ত বস্তু সর্বদা কেবল apগল জায়গায় সংরক্ষণ করা হয়, তাই সমস্ত স্ট্রিং হিপ স্পেসে সংরক্ষণ করা হয়। যাইহোক, জাভা হ'ল স্পেসের একটি বিশেষ অঞ্চলে নতুন কীওয়ার্ডটি ব্যবহার না করে তৈরি স্ট্রিংগুলি রাখে, যাকে "স্ট্রিং পুল" বলা হয়। জাভা নিয়মিত হিপ স্পেসে নতুন কীওয়ার্ড ব্যবহার করে তৈরি স্ট্রিংগুলি রাখে।

স্ট্রিং পুলের উদ্দেশ্য হ'ল অনন্য স্ট্রিংগুলির একটি সেট বজায় রাখা। আপনি যে কোনও সময় নতুন কীওয়ার্ডটি ব্যবহার না করে একটি নতুন স্ট্রিং তৈরি করার সময় জাভা একই স্ট্রিংটি স্ট্রিং পুলে ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করে। যদি এটি করে, জাভা একই স্ট্রিং অবজেক্টের একটি রেফারেন্স প্রদান করে এবং যদি তা না করে তবে জাভা স্ট্রিং পুলে একটি নতুন স্ট্রিং অবজেক্ট তৈরি করে এবং তার রেফারেন্স প্রদান করে। সুতরাং, উদাহরণস্বরূপ, যদি আপনি নীচে দেখানো হিসাবে আপনার কোডে দুবার "হ্যালো" স্ট্রিং ব্যবহার করেন, আপনি একই স্ট্রিংয়ের একটি রেফারেন্স পাবেন। নিম্নলিখিত কোডটিতে প্রদর্শিত হিসাবে == অপারেটর ব্যবহার করে দুটি ভিন্ন রেফারেন্স ভেরিয়েবলের তুলনা করে আমরা আসলে এই তত্ত্বটি পরীক্ষা করতে পারি :

String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2); //prints true

String str3 = new String("hello");
String str4 = new String("hello");

System.out.println(str1 == str3); //prints false
System.out.println(str3 == str4); //prints false 

== অপারেটরটি কেবল দু'টি রেফারেন্স একই অবজেক্টের দিকে নির্দেশ করে কিনা তা যাচাই করে এবং যদি তা করে তবে সত্য হয়। উপরের কোডে, str2 একই স্ট্রিং অবজেক্টের রেফারেন্স পায় যা আগে তৈরি হয়েছিল। তবে, str3 এবং str4 দুটি সম্পূর্ণ ভিন্ন স্ট্রিং অবজেক্টের রেফারেন্স পেয়েছে । এই কারণেই str1 == str2 সত্য ফিরে আসে তবে str1 == str3 এবং str3 == str4 মিথ্যা প্রত্যাবর্তন করে। আসলে, আপনি যখন নতুন স্ট্রিং করেন ("হ্যালো"); প্রোগ্রামের যে কোনও জায়গায় এই প্রথম যখন "হ্যালো" স্ট্রিংটি ব্যবহার করা হয় কেবল দুটিটির পরিবর্তে দুটি স্ট্রিং অবজেক্ট তৈরি করা হয়েছে - একটি উদ্ধৃত স্ট্রিং ব্যবহারের কারণে স্ট্রিং পুলে একটি এবং নিয়মিত হিপ স্পেসে একটি কারণ নতুন কীওয়ার্ড ব্যবহারের।

স্ট্রিং পুলিং হ'ল জাভা এর একই মান সমেত একাধিক স্ট্রিং অবজেক্ট তৈরি করা এড়িয়ে প্রোগ্রামের মেমরি সঞ্চয় করার উপায়। স্ট্রিংয়ের ইন্টার্ন পদ্ধতি ব্যবহার করে নতুন কীওয়ার্ড ব্যবহার করে তৈরি করা স্ট্রিংয়ের জন্য স্ট্রিং পুল থেকে স্ট্রিং পাওয়া সম্ভব। একে স্ট্রিং অবজেক্টের "ইন্টার্নিং" বলা হয়। উদাহরণ স্বরূপ,

String str1 = "hello";
String str2 = new String("hello");
String str3 = str2.intern(); //get an interned string obj

System.out.println(str1 == str2); //prints false
System.out.println(str1 == str3); //prints true
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.