"পাঠ্য" এবং নতুন স্ট্রিং ("পাঠ্য") এর মধ্যে পার্থক্য কী?


195

নিম্নলিখিত দুটি বিবৃতি মধ্যে পার্থক্য কি?

String s = "text";

String s = new String("text");


যে কেউ এই উত্তর দিন। স্ট্রিং a = "জাভা"; স্ট্রিং বি = "জাভা"; System.out.println (a == খ); সত্য // তবে System.out.println ("a == b?" + a == খ); // মিথ্যা ...
শক্তি

আমি বুঝতে পারি না যখন আমি কিছু মন্তব্য যুক্ত করেছি ("a == b?) => আমার ফলাফলটি মিথ্যা হয়ে যায়। কেন?
শক্তি

@ এনারজি ফলাফলটি falseকারণ অপারেশন ক্রম নির্দেশ করে যে + অপারেটর প্রথমে যায়, "এ == বি" কে সম্মতি জানায় ? স্ট্রিং "a == বি? জাভা" তৈরি করতে একটি দিয়ে। তারপরে অভিব্যক্তিটি "a==b?Java" == bমিথ্যাতে মূল্যায়ন করে।
অ্যালিসন বি

@ অ্যালিসনবি এটি পেয়েছে, আপনাকে অনেক ধন্যবাদ!
শক্তি

উত্তর:


187

new String("text"); স্পষ্টভাবে একটি Stringবস্তুর একটি নতুন এবং স্বতন্ত্র স্বতন্ত্র উদাহরণ তৈরি করে ; স্ট্রিং ধ্রুবক পুলString s = "text"; থেকে কোনও উদাহরণ পাওয়া গেলে পুনরায় ব্যবহার করতে পারে ।

আপনি খুব কমই কখনও new String(anotherString)নির্মাণকারী ব্যবহার করতে চাইবেন । এপিআই থেকে:

String(String original): একটি নতুন নির্মিত String বস্তুর সূচনা করে যাতে এটি যুক্তির মতো অক্ষরের একই ক্রমকে উপস্থাপন করে; অন্য কথায়, নতুন নির্মিত স্ট্রিংটি আর্গুমেন্ট স্ট্রিংয়ের অনুলিপি। মূলের একটি স্পষ্ট অনুলিপি প্রয়োজন না হলে, স্ট্রিংগুলি পরিবর্তনযোগ্য না হওয়ায় এই নির্মাণকারীর ব্যবহার অপ্রয়োজনীয়।

সম্পর্কিত প্রশ্নগুলি


রেফারেনশিয়াল পার্থক্য বলতে কী বোঝায়

নিম্নলিখিত স্নিপেট পরীক্ষা করুন:

    String s1 = "foobar";
    String s2 = "foobar";

    System.out.println(s1 == s2);      // true

    s2 = new String("foobar");
    System.out.println(s1 == s2);      // false
    System.out.println(s1.equals(s2)); // true

==দুটি রেফারেন্স ধরণের উপর একটি রেফারেন্স পরিচয় তুলনা হয়। দুটি বস্তু যা equalsঅগত্যা নয় ====রেফারেন্সের ধরণগুলিতে ব্যবহার করা সাধারণত ভুল হয় ; বেশিরভাগ সময় equalsপরিবর্তে ব্যবহার করা প্রয়োজন।

তবুও, যদি কোনও কারণে আপনাকে দুটি তৈরি করতে হবে equalsতবে ==স্ট্রিং নয় , আপনি কনস্ট্রাক্টরটি ব্যবহার করতে পারেন new String(anotherString)। এটি আবার বলা দরকার, তবে এটি খুব অদ্ভুত এবং এটি খুব কমই উদ্দেশ্য।

তথ্যসূত্র

সম্পর্কিত ব্যাপার


3
যদি আমি লিখি: স্ট্রিং s = নতুন স্ট্রিং ("abc"); এবং এখন আমি লিখছি: স্ট্রিং s = "abc"; উইল স্ট্রিং s = "এবিসি"; স্ট্রিং পুলে একটি নতুন স্ট্রিং আক্ষরিক তৈরি করবেন?
কবিশ কানওয়াল

পূর্ববর্তী প্রশ্নের উত্তর কেন কেউ দেয় না?
জেডগুলি

2
@ কাব্যেশকানওয়াল নং, আক্ষরিক নকল হবে না। আপনি দেখতে পাচ্ছেন যে 2 "abc"টি আছে। তাদের মধ্যে কেবল একটি স্ট্রিং পুলে যাবে, এবং অন্যটি এটি উল্লেখ করবে। তারপরে রয়েছে sযা সঠিক নতুন বস্তু হবে।
কায়মন

1
@ কাভিশ কানওয়াল - স্ট্রিং s = নতুন স্ট্রিং ("abc") কেবলমাত্র "abc" মান সহ একটি নতুন স্ট্রিং অবজেক্ট তৈরি করবে। এবং ২ য় বিবৃতিতে স্ট্রিং পুলটিতে ইতিমধ্যে উপস্থিত কোন "abc" স্ট্রিং আছে কিনা তা যাচাই করবে। যদি ইতিমধ্যে উপস্থিত থাকে তবে বিদ্যমানগুলির রেফারেন্স ফিরিয়ে দেওয়া হয় এবং তা না হলে স্ট্রিং পুলে নতুন আক্ষরিক ("abc") তৈরি করা হয়। আশা করি এটি আপনার প্রশ্নের সমাধান করেছে!
user968813

এটি সম্পর্কে 'মে' নেই। সংকলকটি অবশ্যই স্ট্রিং লিটারেলগুলিকে পুল করবে। জেএলএস 3.10.5
মারকুইস লর্ন

119

স্ট্রিং লিটারেল ঢোকা হবে স্ট্রিং ধ্রুবক পুল

নীচের স্ন্যাপশটটি এটিকে দীর্ঘ সময়ের জন্য স্মরণে রাখতে আপনাকে দৃষ্টিভঙ্গি বুঝতে সহায়তা করতে পারে ।

এখানে চিত্র বর্ণনা লিখুন


লাইন দ্বারা নির্মাণ লাইন অবজেক্ট:

String str1 = new String("java5");

কনস্ট্রাক্টরে স্ট্রিং আক্ষরিক "java5" ব্যবহার করে একটি নতুন স্ট্রিং মান স্ট্রিং ধ্রুবক পুলে সংরক্ষণ করা হয়। নতুন অপারেটর ব্যবহার করে, একটি নতুন স্ট্রিং অবজেক্টটি মান হিসাবে "জাভা 5" দিয়ে হিপে তৈরি করা হয়।

String str2 = "java5"

"Str2" রেফারেন্সটি স্ট্রিং ধ্রুবক পুলে ইতিমধ্যে সঞ্চিত মানকে নির্দেশ করা হয়

String str3 = new String(str2);

"স্ট্র 2" দ্বারা রেফারেন্স হিসাবে একই মান সহ হিপে একটি নতুন স্ট্রিং অবজেক্ট তৈরি করা হয়

String str4 = "java5";

"Str4" রেফারেন্সটি স্ট্রিং ধ্রুবক পুলে ইতিমধ্যে সঞ্চিত মানকে নির্দেশ করা হয়

মোট অবজেক্টস: গাদা - 2, পুল - 1

ওরাকল সম্প্রদায়ের উপর আরও পড়া


1
উত্তম উত্তর .. তবে জানতে পেরেছি এখন আমি str1 = "java6" এর মান পরিবর্তন করতে যাচ্ছি তবে এটি কী str4 এর মান পরিবর্তন করবে?
করোনাপিন্টু

2
হ্যাঁ আমি পরীক্ষা করেছিলাম এটি str4 এর মান পরিবর্তন করবে না
CoronaPintu

@ ব্রজ আপনি কি নিজের উত্তরের দৃ of়তার ডকুমেন্টেশন সরবরাহ করতে পারবেন?
তুলসী বাউরক

@ ব্রজ: টেবিলের 'হিপ' এবং 'পুল' এর শিরোনামগুলি কি বিপরীত বলে মনে হচ্ছে?
রাহুল কুরুপ

সঠিক না. ধ্রুব পুলটি সংকলন সময়ে তৈরি করা হয়, কার্যকর করার সময় নয়। উদ্ধৃত নয় এমন পাঠ্যের জন্য উদ্ধৃতি বিন্যাস ব্যবহার করবেন না।
লার্নের মারকুইস

15

স্ট্রিং কনস্ট্যান্ট পুলটিতে একটি স্ট্রিং তৈরি করে

String s = "text";

অপরটি ধ্রুবক পুল ( "text") এ স্ট্রিং তৈরি করে এবং অন্য সাধারণ স্ট্র্যাপে স্ট্রিং তৈরি করে ( s)। উভয় স্ট্রিংয়ের "টেক্সট" এর মান একই হবে।

String s = new String("text");

s পরে যদি ব্যবহার না করা হয় তবে তা (জিসির জন্য যোগ্য) হারিয়ে যায় lost

অন্যদিকে স্ট্রিং লিটারেলগুলি পুনরায় ব্যবহার করা হয়েছে। আপনি যদি "text"আপনার ক্লাসের একাধিক জায়গায় ব্যবহার করেন তবে এটি বাস্তবে এক এবং কেবল একটি স্ট্রিং (যেমন পুলে একই স্ট্রিংয়ের একাধিক উল্লেখ)।


ধ্রুব পুলে স্ট্রিংগুলি কখনই হারিয়ে যায় না। আপনার অর্থ কি পরে ব্যবহার না করা হলে 'গুলি' হারিয়ে গেছে?
লার্নের মারকুইস

@ ইজেপি: হ্যাঁ, আমার অর্থ "এস" ছিল। লক্ষ্য করার জন্য ধন্যবাদ। আমি প্রশ্ন সংশোধন করব।

9

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 কাঠামো (.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এনালগ নেই)।


2

@ ব্রজ: আমার মনে হয় আপনি অন্য দিকের কথা উল্লেখ করেছেন। আমি ভুল হলে আমাকে সংশোধন করুন

লাইন দ্বারা নির্মাণ লাইন অবজেক্ট:

স্ট্রিং str1 = নতুন স্ট্রিং ("java5")

   Pool- "java5" (1 Object)

   Heap - str1 => "java5" (1 Object)

স্ট্রিং str2 = "java5"

  pool- str2 => "java5" (1 Object)

  heap - str1 => "java5" (1 Object)

স্ট্রিং str3 = নতুন স্ট্রিং (str2)

  pool- str2 => "java5" (1 Object)

  heap- str1 => "java5", str3 => "java5" (2 Objects)

স্ট্রিং str4 = "java5"

  pool - str2 => str4 => "java5" (1 Object)

  heap - str1 => "java5", str3 => "java5" (2 Objects)

str1মূল্য জড়িত নয় str2বা str3বা str4অন্য কোন উপায়ে।
মারকুইস

1

(ছদ্ম) "bla"মত একটি যাদু কারখানা হওয়ার কথা ভাবেন Strings.createString("bla")। কারখানাটিতে এখনও এইভাবে তৈরি করা সমস্ত স্ট্রিংয়ের একটি পুল রয়েছে।

যদি এটি চাওয়া হয়, এটি ইতিমধ্যে এই মান সহ পুলটিতে স্ট্রিং রয়েছে কিনা তা পরীক্ষা করে। যদি সত্য হয়, এটি এই স্ট্রিং অবজেক্টটিকে ফেরত দেয়, সুতরাং এইভাবে প্রাপ্ত স্ট্রিংগুলিতে সত্যই একই বস্তু।

যদি তা না হয় তবে এটি অভ্যন্তরীণভাবে একটি নতুন স্ট্রিং অবজেক্ট তৈরি করে, এটি পুলে সংরক্ষণ করে এবং তারপরে ফিরে আসে। সুতরাং, যখন একই স্ট্রিংয়ের মানটি পরের বার জিজ্ঞাসা করা হয়, এটি একই উদাহরণটি দেয়।

new String("")স্ট্রিং আক্ষরিক পুলকে বাইপাস করে ম্যানুয়ালি এই আচরণটি ওভাররাইডগুলি তৈরি করে। সুতরাং সমতা সর্বদা ব্যবহার করে যাচাই করা উচিত equals()যা বস্তুর রেফারেন্স সাম্যের পরিবর্তে অক্ষর ক্রমটির তুলনা করে।


আপনি যে 'যাদু ফ্যাক্টরি' উল্লেখ করেছেন তা জাভা সংকলকটির চেয়ে কম বা কম কিছুই নয়। এই প্রক্রিয়াটি লিখতে ভুল যেমন এটি রানটাইম সময়ে ঘটেছিল।
লার্নের মারকুইস

1

পার্থক্যটি বোঝার একটি সহজ উপায় নীচে:

String s ="abc";
String s1= "abc";
String s2=new String("abc");

        if(s==s1){
            System.out.println("s==s1 is true");
        }else{
            System.out.println("s==s1 is false");
        }
        if(s==s2){
            System.out.println("s==s2 is true");
        }else{
            System.out.println("s==s2 is false");
        }

আউটপুট হয়

s==s1 is true
s==s2 is false

সুতরাং নতুন স্ট্রিং () সর্বদা একটি নতুন উদাহরণ তৈরি করবে।


1

যে কোনও স্ট্রিং আক্ষরিক স্ট্রিং আক্ষরিক পুলের অভ্যন্তরে তৈরি হয় এবং পুলটি কোনও সদৃশকে অনুমতি দেয় না। সুতরাং যদি দুটি বা ততোধিক স্ট্রিং অবজেক্ট একই আক্ষরিক মান দিয়ে আরম্ভ করা হয় তবে সমস্ত বস্তু একই আক্ষরিক দিকে নির্দেশ করবে।

String obj1 = "abc";
String obj2 = "abc";

"obj1" এবং "obj2" একই স্ট্রিং আক্ষরিক দিকে নির্দেশ করবে এবং স্ট্রিং আক্ষরিক পুলটিতে কেবল একটি "abc" আক্ষরিক থাকবে।

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

String obj1 = new String("abc");
String obj2 = new String("abc");

"obj1" এবং "obj2" হিপগুলিতে দুটি পৃথক অবজেক্টের দিকে নির্দেশ করবে এবং স্ট্রিং লিটারেল পুলটিতে কেবল একটি "এবিসি" আক্ষরিক থাকবে।

এছাড়াও স্ট্রিংগুলির আচরণের সাথে মনোযোগ দেওয়ার মতো বিষয় হ'ল স্ট্রিংয়ে করা কোনও নতুন অ্যাসাইনমেন্ট বা কনটেন্টেশন স্মৃতিতে একটি নতুন অবজেক্ট তৈরি করে।

String str1 = "abc";
String str2 = "abc" + "def";
str1 = "xyz";
str2 = str1 + "ghi";

এখন উপরের ক্ষেত্রে:
লাইন 1: "abc" আক্ষরিক স্ট্রিং পুলে সংরক্ষণ করা হয়।
লাইন 2: "abcdef" আক্ষরিক স্ট্রিং পুলে সংরক্ষণ করা হয়।
লাইন 3: একটি নতুন "xyz" আক্ষরিক স্ট্রিং পুলে সংরক্ষণ করা হয় এবং "str1" এই আক্ষরিক দিকে নির্দেশ করতে শুরু করে।
লাইন 4: যেহেতু মানটি অন্য ভেরিয়েবলের সাথে যুক্ত করে উত্পন্ন হয় ফলাফলটি হিপ মেমরিতে সংরক্ষণ করা হয় এবং আক্ষরিক "ghi" সংযুক্ত হয়ে স্ট্রিং পুলে তার অস্তিত্বের জন্য পরীক্ষা করা হবে এবং এটি তৈরি হবে কারণ এটি বিদ্যমান নেই doesn't উপরের ক্ষেত্রে।


0

যদিও এটি প্রোগ্রামার দৃষ্টিকোণ থেকে একই দেখায়, এটির বড় পারফরম্যান্স প্রভাব রয়েছে। আপনি প্রায় সর্বদা প্রথম ফর্মটি ব্যবহার করতে চান।


0
String str = new String("hello")

এটি পরীক্ষা করবে যে স্ট্রিং ধ্রুবক পুলটিতে ইতিমধ্যে স্ট্রিং "হ্যালো" রয়েছে কিনা? যদি উপস্থিত থাকে তবে এটি স্ট্রিং ধ্রুবক পুলে কোনও এন্ট্রি যুক্ত করবে না। যদি উপস্থিত না থাকে তবে এটি স্ট্রিং ধ্রুবক পুলে একটি এন্ট্রি যুক্ত করবে।

একটি হ্যাপ মেমরি এরিয়াতে একটি strবস্তু তৈরি করা হবে এবং হিপ মেমরির অবস্থানটিতে তৈরি করা বস্তুর রেফারেন্স পয়েন্ট।

আপনি যদি strস্ট্রিং ধ্রুবক পুলে থাকা পয়েন্ট অবজেক্টের রেফারেন্স চান তবে অবশ্যই স্পষ্টভাবে কল করতে হবেstr.intern();

String str = "world";

এটি পরীক্ষা করবে যে স্ট্রিং ধ্রুবক পুলটিতে ইতিমধ্যে স্ট্রিং "হ্যালো" রয়েছে কিনা? যদি উপস্থিত থাকে তবে এটি স্ট্রিং ধ্রুবক পুলে কোনও এন্ট্রি যুক্ত করবে না। যদি উপস্থিত না থাকে তবে এটি স্ট্রিং ধ্রুবক পুলে একটি এন্ট্রি যুক্ত করবে।

উপরের উভয় ক্ষেত্রে, কনস্ট্যান্ট পুলে উপস্থিত strস্ট্রিংয়ের জন্য রেফারেন্স পয়েন্ট "world"


'এটি' জাভা সংকলক হচ্ছে। স্ট্রিং আক্ষরিক সংকলন সময়ে ধ্রুবক পুলটিতে একটি অনন্য প্রবেশ তৈরি করে। এই প্রক্রিয়াটিকে deacribe করা ভুল যেমন রানটাইম সময়ে ঘটে থাকে ..
মারকুইস

আপনি কি দয়া করে এই পোস্টে কী ভুল তা পরিষ্কার করে ব্যাখ্যা করতে পারেন?
জয়েশ

এই পোস্টে যা ভুল তা হ'ল স্ট্রিং আক্ষরিক কমপ্লিট সময়ে পুল করা হয়, যেমনটি আমি ইতিমধ্যে বলেছি। কোডটি কার্যকর করার সময় নয়, যেমন আপনার উত্তরে।
মার্কুইস

@ ইজেপি আমি আপনার প্রতিক্রিয়াটির প্রশংসা করি। আপনি দয়া করে উত্তরটি ভুল যা সঠিক লাইন চিহ্নিত করতে পারেন। আমি দেখছি উপরের সমস্ত উত্তরগুলি আমি যা লিখেছি ঠিক একই। দয়া করে সাহায্য করুন, আমি আমার বোঝার সংশোধন করতে চাই। ধন্যবাদ।
জয়েশ

আপনি পুরো প্রক্রিয়াটি সম্পর্কে লিখেছেন যেমন কোড লাইনটি কার্যকর হওয়ার সময় এটি ঘটে থাকে, যা আমি আপনাকে বারবার বলেছি, ঘটনাটি নয়। আপনার উত্তরে ভুল হওয়াতে আপনি একক 'সঠিক লাইন' এ সমস্ত কিছু হ্রাস করতে পারবেন না।
মারকুইস

0

আপনি যখন স্ট্রিং হিসাবে সংরক্ষণ করেন

String string1 = "Hello";

সরাসরি, তারপরে JVM স্ট্রিং ধ্রুবক পুল নামক মেমরির পৃথক ব্লকের সময় প্রদত্ত দামের সাথে একটি স্ট্রিং অবজেক্ট তৈরি করে।

এবং যখনই আমাদের অন্য স্ট্রিং হিসাবে চেষ্টা করার এবং তৈরি করার প্রবণতা রয়েছে

String string2 = "Hello";

স্ট্রিং ধ্রুবক পুলের মধ্যে ধ্রুবক দামের কোনও স্ট্রিং অবজেক্ট বিদ্যমান কিনা তা জেভিএম যাচাই করে, যদি তাই হয় তবে একেবারে নতুন অবজেক্ট তৈরি করার পরিবর্তে জেভিএম বিদ্যমান বস্তুর রেফারেন্সটিকে নতুন ভেরিয়েবলের জন্য বরাদ্দ করে।

এবং আমরা স্ট্রিং হিসাবে যখন

String string = new String("Hello");

নতুন কীওয়ার্ডটি ব্যবহার করে, প্রদত্ত দাম সহ একটি ব্র্যান্ড নতুন অবজেক্ট স্ট্রিং ধ্রুবক পুলের বিষয়বস্তু বিবেচনা করেই তৈরি করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.