আমাদের স্ট্রিং অন স্ট্রিং লিটারেলগুলির ইন্টার্ন পদ্ধতি কখন ব্যবহার করা উচিত


187

মতে স্ট্রিং # অন্তরীণ () , internপদ্ধতি যদি স্ট্রিং স্ট্রিং পুকুর পাওয়া যায় স্ট্রিং পুকুর থেকে STRING ফেরার, অন্যথায় একটি নতুন স্ট্রিং অবজেক্ট স্ট্রিং পুলে যুক্ত হবে এবং এই স্ট্রিং এর রেফারেন্স ফিরিয়ে দেওয়া হয় অনুমিত হয়।

সুতরাং আমি এটি চেষ্টা করেছি:

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

আমি আশা করছিলাম যে s1 and s3 are sameএস 3 ইন্টার্নযুক্ত হিসাবে মুদ্রিত s1 and s2 are sameহবে , এবং মুদ্রিত হবে না। কিন্তু ফল হ'ল উভয় লাইনই মুদ্রিত। সুতরাং এর অর্থ, ডিফল্টরূপে স্ট্রিং ধ্রুবকগুলি ইন্টার্ন করা হয়। তবে যদি তা হয় তবে আমাদের internপদ্ধতিটি কেন প্রয়োজন ? অন্য কথায় কখন আমাদের এই পদ্ধতিটি ব্যবহার করা উচিত?


14
আপনার সংযুক্ত জাভাডোকে "সমস্ত আক্ষরিক স্ট্রিং এবং স্ট্রিং-মূল্যবান ধ্রুবক অভিব্যক্তি ইন্টার্ন করা হয়।"
উয়র্ন


1
হুবহু নকল নয় ..
বোজহো

1
@ জর্ন: ঠিক আছে। সুতরাং কেন আমরা internপাবলিক পদ্ধতি হিসাবে আছে । আমাদের internব্যক্তিগত পদ্ধতি না থাকা উচিত, যাতে কারও কাছে এটির অ্যাক্সেস না থাকতে পারে। নাকি এই পদ্ধতির কোনও উদ্দেশ্য আছে?
রাকেশ জুয়াল

2
@ রাকেশজুয়াল: ইন্টার্ন পদ্ধতিটি একটি স্ট্রিং টাইপের উপরে সংজ্ঞায়িত করা হয় যা স্ট্রিং লিটারেল বা ভেরিয়েবল হতে পারে। পদ্ধতিটি বেসরকারী হলে আপনি কীভাবে কোনও পরিবর্তনশীলকে অভ্যন্তরীণ করবেন?
বোবিলেেক্স

উত্তর:


230

জাভা স্বয়ংক্রিয়ভাবে স্ট্রিং লিটারেলগুলিকে ইন্টার্ন করে। এর অর্থ হ'ল অনেক ক্ষেত্রে, == অপারেটর স্ট্রিংসের জন্য একইভাবে কাজ করতে দেখা যায় যা এটি ইনট বা অন্যান্য আদিম মানগুলির জন্য কাজ করে।

যেহেতু ইন্টার্নিং স্ট্রিং লিটারেলগুলির জন্য স্বয়ংক্রিয় তাই intern()পদ্ধতিটি স্ট্রিংগুলিতে নির্মিত ব্যবহার করা উচিতnew String()

আপনার উদাহরণ ব্যবহার করে:

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
String s4 = new String("Rakesh");
String s5 = new String("Rakesh").intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

if ( s1 == s4 ){
    System.out.println("s1 and s4 are same" );  // 3.
}

if ( s1 == s5 ){
    System.out.println("s1 and s5 are same" );  // 4.
}

ফিরে আসবে:

s1 and s2 are same
s1 and s3 are same
s1 and s5 are same

s4ভেরিয়েবল ছাড়াও সমস্ত ক্ষেত্রে , একটি মান যার জন্য স্পষ্টভাবে newঅপারেটর ব্যবহার করে তৈরি করা হয়েছিল এবং যেখানে internএর ফলাফলের উপর পদ্ধতি ব্যবহার করা হয়নি, এটি জেভিএমের স্ট্রিং ধ্রুবক পুলটি ফিরে আসার একক একমাত্র অস্থাবর উদাহরণ ।

আরও তথ্যের জন্য জাভাটেকনিকগুলি "স্ট্রিং সমতা এবং অভ্যন্তরীণ" পড়ুন ।


আমি ধরে নিচ্ছি যে জাভা স্বয়ংক্রিয়ভাবে অপ্টিমাইজেশনের উদ্দেশ্যে স্ট্রিং লিটারেলগুলি ইন্টার্ন করে। এটি কেবল নিরাপদে এটি করতে পারে কারণ স্ট্রিংগুলি অপরিবর্তনীয়, সঠিক?
স্টিফ্লে

জাভাতে নতুন (আমি সি #। নেট বিশ্ব থেকে এসেছি) এবং আমি মাঝে মাঝে একটি জাভা উত্তরাধিকার প্রজেক্টে দেখতে পাই "" ইনটার্ন () তাই যদি আমি এটি সঠিকভাবে বুঝতে পারি যে এটি খালি স্ট্রিংয়ের জন্যও "ননসেন্স"।
hfrmobile

4
@ মিগুয়েল সুন্দর ব্যাখ্যা, আমার প্রশ্ন এখানে আপনার উদাহরণে কীভাবে আপত্তি সৃষ্টি করতে পারে তা। এখানে আমার আসাম্প্শান হল: String s1 = "Rakesh"; প্রথম OB1 String s4 = new String("Rakesh");(S2, S3, S5) রেফারেন্স একই বস্তু (OB1) 'স্ট্রিং পুল' সুতরাং এর মধ্যে তৈরি করা আমি বলতে পারি যে দ্বিতীয় OB2 তাই বাকি .intern()নতুন অবজেক্ট তৈরি করতে পদ্ধতি আটকান জন্য ব্যবহৃত যদি একই স্ট্রিং উপলব্ধ string poolতাহলে আমার ধারনা ভুল তাই আমাকে দিকনির্দেশনা দিন।
হাইব্রিহেল্প

1
জাভাটেকনিক্স লিঙ্কটি ভাঙা হয়েছে
এসজুয়ান 76


20

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

ইন্টার্নড স্ট্রিংসের আরেকটি ছোট সুবিধা হ'ল স্ট্রিংগুলির ==তুলনা করতে যদি সমস্ত জড়িত স্ট্রিংগুলিকে ইন্টার্ন করার নিশ্চয়তা দেওয়া হয় তবে (সাফল্য!) ব্যবহার করা যেতে পারে। লেনার সিনট্যাক্স ছাড়াও এটি একটি পারফরম্যান্স বর্ধন। কিন্তু অন্যরা যেমন উল্লেখ করেছে, এই বন্দরটি প্রোগ্রামিং ত্রুটিগুলি প্রবর্তন করার একটি দুর্দান্ত ঝুঁকি রয়েছে, সুতরাং এটি কেবল শেষ অবলম্বনের একটি উদ্বেগজনক পরিমাপ হিসাবে করা উচিত।

নেতিবাচক দিকটি হ'ল স্ট্রিংকে ইন্টার্নিং করার জন্য এটি কেবল স্তূপের উপরে ফেলে দেওয়ার চেয়ে বেশি সময় নেয়, এবং জাভা প্রয়োগের উপর নির্ভর করে ইন্টার্নড স্ট্রিংসের জন্য জায়গা সীমিত হতে পারে। আপনি অনেক অনুলিপি সহ স্ট্রিংয়ের জ্ঞাত যুক্তিসঙ্গত সংখ্যার সাথে ডিল করছেন যখন এটি সবচেয়ে ভাল।


@ The downside is that interning a String takes more time than simply throwing it on the heap, and that the space for interned Strings may be limitedআপনি যদি স্ট্রিং ধ্রুবকটির জন্য ইন্টার্ন পদ্ধতি ব্যবহার না করেন তবে এটি স্বয়ংক্রিয়ভাবে অভ্যন্তরীণ হবে।
রাকেশ জুয়াল

2
@ রাকেশ: সাধারণত কোনও শ্রেণিতে স্ট্রিং ধ্রুবকগুলি সাধারণত থাকে না, তাই ধ্রুবকগুলির সাথে এটি স্থান / সময়ের সমস্যা নয়।
ডেভিড রদ্রিগেজ - ড্রিবাস

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

2
+1 টি। আমি মনে করি এটি যখন ইন্টার্নিং অর্থবোধ করে তখন এটির একটি ভাল উদাহরণ। ==যদিও আমি স্ট্রিংয়ের জন্য একমত হই না ।
আলেকজান্ডার পোগ্রেবন্যাক

1
জাভা 7 এর পরে "স্ট্রিং পুল" হিপ স্পেসে প্রয়োগ করা হয়েছে, সুতরাং এটি ইন্টার্নগুলি সংরক্ষণের সমস্ত সুবিধা পায়, আবর্জনা সংগ্রহ এবং এর আকার সীমাবদ্ধ নয়, এটি গাদা আকার পর্যন্ত বাড়ানো যেতে পারে ((আপনার কখনই এর বেশি প্রয়োজন হবে না will স্ট্রিংগুলির জন্য মেমরি)
অনিল উত্তানি

15

আমি ==ইন্টার্নযুক্ত স্ট্রিংগুলি ব্যবহার করে আমার 2 সেন্ট যুক্ত করতে চাই ।

প্রথম জিনিসটি String.equalsহয় this==object

সুতরাং যদিও কিছু ক্ষুদ্র পারফরম্যান্স লাভ রয়েছে (আপনি কোনও পদ্ধতি কল করছেন না) তবে রক্ষণাবেক্ষণের দৃষ্টিকোণ থেকে ব্যবহার ==করা দুঃস্বপ্ন, কারণ কিছু অভ্যন্তরীণ স্ট্রিংগুলি নন-ইন্টার্নযুক্ত হওয়ার প্রবণতা রয়েছে।

সুতরাং আমি ==অভ্যন্তরীণ স্ট্রিংগুলির জন্য বিশেষ ক্ষেত্রে নির্ভর না করার পরামর্শ দিচ্ছি , তবে সর্বদা equalsগোসলিংয়ের উদ্দেশ্যে হিসাবে ব্যবহার করুন ।

সম্পাদনা: অভ্যন্তরীণ অ অভ্যন্তরীণ হয়ে উঠছে:

V1.0
public class MyClass
{
  private String reference_val;

  ...

  private boolean hasReferenceVal ( final String[] strings )
  {
    for ( String s : strings )
    {
      if ( s == reference_val )
      {
        return true;
      }
    }

    return false;
  }

  private void makeCall ( )
  {
     final String[] interned_strings =  { ... init with interned values ... };

     if ( hasReference( interned_strings ) )
     {
        ...
     }
  }
}

২.০ সংস্করণে রক্ষণাবেক্ষণকারী hasReferenceValআরও বিশদে না গিয়ে সর্বজনীন করার সিদ্ধান্ত নিয়েছে যা এটি অভ্যন্তরীণ স্ট্রিংগুলির একটি অ্যারের প্রত্যাশা করে।

V2.0
public class MyClass
{
  private String reference_val;

  ...

  public boolean hasReferenceVal ( final String[] strings )
  {
    for ( String s : strings )
    {
      if ( s == reference_val )
      {
        return true;
      }
    }

    return false;
  }

  private void makeCall ( )
  {
     final String[] interned_strings =  { ... init with interned values ... };

     if ( hasReference( interned_strings ) )
     {
        ...
     }
  }
}

এখন আপনার কাছে একটি ত্রুটি রয়েছে, এটি খুঁজে পাওয়া খুব কঠিন because কারণ বেশিরভাগ ক্ষেত্রে অ্যারেতে আক্ষরিক মান রয়েছে এবং কখনও কখনও অ-আক্ষরিক স্ট্রিং ব্যবহার করা হয়। এর equalsপরিবর্তে যদি ব্যবহৃত হয় ==তবে hasReferenceValএখনও কাজ চালিয়ে যেতে পারত। আবারও, পারফরম্যান্স লাভ হ'ল ছোট, তবে রক্ষণাবেক্ষণ ব্যয় বেশি।


"কিছু অভ্যন্তরীণ স্ট্রিংগুলির অভ্যন্তরীণ অভ্যন্তরীণ হওয়ার প্রবণতা রয়েছে।" বাহ, এটা হবে ... আজব। আপনি একটি রেফারেন্স উদ্ধৃত করতে পারেন, দয়া করে?
কার্ল স্মট্রিক্জ

2
ঠিক আছে, আমি ভেবেছিলাম আপনি স্ট্রিংগুলি উল্লেখ করছেন যা আসলে ইন্টারভেন পুলের বাইরে ঘুরে বেড়াচ্ছে এবং জেভিএম-তে যাদু করার জন্য ধন্যবাদ রইল। আপনি যা বলছেন তা হ'ল == নির্দিষ্ট শ্রেণীর প্রোগ্রামার ত্রুটিগুলি আরও বেশি করে তোলে।
কার্ল স্মট্রিক্জ

"সুতরাং আমি অভ্যন্তরীণ স্ট্রিংগুলির জন্য == এর বিশেষ ক্ষেত্রে নির্ভর না করার পরামর্শ দিই, তবে সবসময় গোসলিংয়ের উদ্দেশ্যে হিসাবে সমান ব্যবহার করি" " গোসলিংয়ের কাছ থেকে এই সম্পর্কে উল্লেখ করে আপনার কাছে সরাসরি উদ্ধৃতি বা মন্তব্য আছে? যদি তা হয় তবে কেন তিনি ভাষাতে ইন্টার্ন () এবং == ব্যবহারের বিষয়টি কেন বিরক্ত করলেন?

1
ইন্টার্ন সরাসরি তুলনার জন্য ভাল নয় (==), যদিও এটি উভয় স্ট্রিং ইন্টার্নযুক্ত থাকলেও এটি কাজ করে। ব্যবহৃত মোট স্মৃতি কমিয়ে দেওয়া দুর্দান্ত: যখন একই স্ট্রিংটি 1 টিরও বেশি জায়গায় ব্যবহৃত হয়।
tgkprog

12

স্ট্রিং আক্ষরিক এবং ধ্রুবকগুলি ডিফল্টরূপে অভ্যন্তরীণ থাকে। এটি, "foo" == "foo"(স্ট্রিং আক্ষরিক দ্বারা ঘোষিত), তবে new String("foo") != new String("foo")


4
সুতরাং, প্রশ্নটি আমাদের কখন ব্যবহার করা উচিত intern,
রকেশ জুয়াল

যেটি গতকাল থেকে স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 1833581 / যখন- থেকে- ব্যবহার- আন্তঃ এবং অন্যান্য বেশ কয়েকটি প্রশ্নের দিকে ইঙ্গিত করা হয়েছিল ।
বোজহো

এই বিবৃতিটির জন্য আমার বোঝাপড়া যদি: আমাকে সঠিকভাবে জানাবেন:, String literals and constants are interned by defaultসঠিক। new String("foo")-> এখানে, একটি স্ট্রিং আক্ষরিক "ফু" স্ট্রিং পুলে এবং একটি হিপতে তৈরি করা হয়েছে, সুতরাং মোট 2 টি অবজেক্ট তৈরি করা হয়েছে।
dkb

8

জাভা স্ট্রিং ইন্টার্ন শিখুন - একবারের জন্য

জাভা স্ট্রিং ডিজাইন দ্বারা স্থাবর বস্তু হয়। সুতরাং, একই মান সহ দুটি স্ট্রিং অবজেক্ট ডিফল্টরূপে পৃথক বস্তু হবে। তবে, আমরা যদি স্মৃতি সঞ্চয় করতে চান, আমরা স্ট্রিং ইন্টার্ন নামে একটি ধারণা দ্বারা একই মেমরি ব্যবহার করতে ইঙ্গিত করতে পারে।

নীচের নিয়মগুলি আপনাকে স্পষ্ট ভাষায় ধারণাটি বুঝতে সহায়তা করবে:

  1. স্ট্রিং ক্লাস একটি ইন্টার্ন-পুল বজায় রাখে যা প্রাথমিকভাবে খালি। এই পুলটি অবশ্যই অনন্য মান সহ স্ট্রিং অবজেক্টগুলিকে ধারণের নিশ্চয়তা দেয়।
  2. সমস্ত স্ট্রিং আক্ষরিকের সমান মান থাকা অবশ্যই একই মেমরি-অবস্থানের বস্তু হিসাবে বিবেচনা করা উচিত কারণ তাদের অন্যথায় পার্থক্যের কোনও ধারণা নেই। অতএব, একই মানের সহ সমস্ত লিটারাল ইন্টার্ন-পুলে একক প্রবেশ করবে এবং একই মেমরির অবস্থানটি উল্লেখ করবে।
  3. দুই বা ততোধিক আক্ষরিকের প্রতিযোগিতাও আক্ষরিক। (সুতরাং নিয়ম # 2 তাদের জন্য প্রযোজ্য হবে)
  4. অবজেক্ট হিসাবে তৈরি প্রতিটি স্ট্রিংয়ের (অর্থাত্ আক্ষরিক ব্যতীত অন্য কোনও পদ্ধতি দ্বারা) বিভিন্ন মেমরির অবস্থান থাকবে এবং ইন্টার্ন-পুলটিতে কোনও প্রবেশ করবে না
  5. অ-আক্ষরিকের সাথে আক্ষরিক সংঘটন একটি অ-আক্ষরিক তৈরি করবে। সুতরাং, ফলস্বরূপ বস্তুর একটি নতুন মেমরি অবস্থান থাকবে এবং ইন্টার্ন-পুলটিতে প্রবেশ করবে না।
  6. স্ট্রিং অবজেক্টে ইন্টার্ন পদ্ধতি চালু করা হয়, হয় একটি নতুন অবজেক্ট তৈরি করে যা ইন্টার্ন-পুলে প্রবেশ করে বা পুল থেকে একটি বিদ্যমান অবজেক্টের একই মান দেয়। ইন্টার্ন-পুলের মধ্যে নেই এমন কোনও বস্তুর অনুরোধটি সেই বস্তুকে পুলটিতে সরিয়ে দেয় না। এটি বরং অন্য একটি বস্তু তৈরি করে যা পুলটিতে প্রবেশ করে।

উদাহরণ:

String s1=new String (“abc”);
String s2=new String (“abc”);
If (s1==s2)  //would return false  by rule #4
If (“abc == a”+”bc )  //would return true by rules #2 and #3
If (“abc == s1 )  //would return false  by rules #1,2 and #4
If (“abc == s1.intern() )  //would return true  by rules #1,2,4 and #6
If ( s1 == s2.intern() )      //wound return false by rules #1,4, and #6

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


আপনাকে # 3 এর জন্য ধন্যবাদ, আমি জানতাম না :)
kaay

4

আপনার দুটি পিরিয়ড সময় করা উচিত যা সংকলন সময় এবং রানটাইম সময় time উদাহরণস্বরূপ:

//example 1 
"test" == "test" // --> true 
"test" == "te" + "st" // --> true

//example 2 
"test" == "!test".substring(1) // --> false
"test" == "!test".substring(1).intern() // --> true

একদিকে, উদাহরণস্বরূপ 1, আমরা ফলাফলগুলি দেখতে পেয়েছি যে সমস্ত সত্য রয়েছে, কারণ সংকলনের সময়, jvm "টেস্ট "টিকে আক্ষরিক স্ট্রিংগুলির পুলটিতে রাখবে, যদি jvm" টেস্ট "উপস্থিত থাকে, তবে এটি বিদ্যমানটিকে ব্যবহার করবে, উদাহরণস্বরূপ 1, "পরীক্ষা" স্ট্রিংগুলি একই মেমরি ঠিকানার দিকে নির্দেশ করে, সুতরাং উদাহরণ 1টি সত্য ফিরে আসবে। অন্যদিকে, উদাহরণ 2-তে, "টেস্ট" == "! পরীক্ষা" এর ক্ষেত্রে রানটাইম সময়ে সাবস্ট্রিংয়ের পদ্ধতি () সঞ্চালনের সময়টি কার্যকর করা হয়। "সাবস্ট্রিং (1), পুলটি দুটি স্ট্রিং অবজেক্ট তৈরি করবে," পরীক্ষা "এবং"! পরীক্ষা ", সুতরাং এগুলি পৃথক রেফারেন্স অবজেক্টস, সুতরাং" কেস "=="! পরীক্ষা "। ইন্টারস্ট্রিং (1)। ইন্টার্ন (), ইন্টার্নের পদ্ধতি () এর ক্ষেত্রে এই ক্ষেত্রেটি মিথ্যা প্রত্যাবর্তন করবে ( ) আক্ষরিক স্ট্রিংয়ের পুলে ""! পরীক্ষা ".সুবস্ট্রিং (1)" রাখবে,


3

http://en.wikipedia.org/wiki/String_interning

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


2

অভ্যন্তরীণ স্ট্রিংগুলি সদৃশ স্ট্রিংগুলি এড়িয়ে চলে। ইন্টার্নিং ডুপ্লিকেট স্ট্রিংগুলি সনাক্ত এবং প্রতিস্থাপন করতে আরও সিপিইউ সময় ব্যয় করে র‌্যাম সাশ্রয় করে। প্রতিটি স্ট্রিংয়ের কেবল একটি অনুলিপি রয়েছে যা ইন্টার্ন করা হয়েছে, যতই উল্লেখযোগ্য রেফারেন্সই এটি নির্দেশ করে না। যেহেতু স্ট্রিংগুলি পরিবর্তনযোগ্য নয়, ঘটনাক্রমে দুটি ভিন্ন পদ্ধতি যদি একই স্ট্রিং ব্যবহার করে তবে তারা একই স্ট্রিংয়ের একটি অনুলিপি ভাগ করতে পারে। ভাগ জনকে সদৃশ স্ট্রিংস রূপান্তর প্রক্রিয়া বলা হয় interning.String.intern () আপনি ক্যানোনিকাল মাস্টার স্ট্রিং এর ঠিকানা দেয়। আপনি এর পরিবর্তে ইন্টার্নযুক্ত স্ট্রিংগুলি তুলনায় তুলনা করতে পারেন সহজ == (যা পয়েন্টারের সাথে তুলনা করে) সমানযা স্ট্রিংয়ের অক্ষরগুলির একে অপরের সাথে তুলনা করে। স্ট্রিংগুলি অপরিবর্তনীয় হওয়ায়, অভ্যন্তরীণ প্রক্রিয়া স্থান সংরক্ষণে আরও মুক্ত, উদাহরণস্বরূপ, "পাত্র" এর জন্য আলাদা স্ট্রিং আক্ষরিক তৈরি না করে যখন এটি "হিপ্পোপটামাস" এর মতো অন্য কিছু আক্ষরিকের স্ট্রিং হিসাবে উপস্থিত থাকে।

আরও দেখতে http://mindprod.com/jgloss/interned.html


2
String s1 = "Anish";
        String s2 = "Anish";

        String s3 = new String("Anish");

        /*
         * When the intern method is invoked, if the pool already contains a
         * string equal to this String object as determined by the
         * method, then the string from the pool is
         * returned. Otherwise, this String object is added to the
         * pool and a reference to this String object is returned.
         */
        String s4 = new String("Anish").intern();
        if (s1 == s2) {
            System.out.println("s1 and s2 are same");
        }

        if (s1 == s3) {
            System.out.println("s1 and s3 are same");
        }

        if (s1 == s4) {
            System.out.println("s1 and s4 are same");
        }

আউটপুট

s1 and s2 are same
s1 and s4 are same

2
String p1 = "example";
String p2 = "example";
String p3 = "example".intern();
String p4 = p2.intern();
String p5 = new String(p3);
String p6 = new String("example");
String p7 = p6.intern();

if (p1 == p2)
    System.out.println("p1 and p2 are the same");
if (p1 == p3)
    System.out.println("p1 and p3 are the same");
if (p1 == p4)
    System.out.println("p1 and p4 are the same");
if (p1 == p5)
    System.out.println("p1 and p5 are the same");
if (p1 == p6)
    System.out.println("p1 and p6 are the same");
if (p1 == p6.intern())
    System.out.println("p1 and p6 are the same when intern is used");
if (p1 == p7)
    System.out.println("p1 and p7 are the same");

দুটি স্ট্রিং স্বাধীনভাবে তৈরি করা হয়, intern()আপনাকে সেগুলি তুলনা করতে দেয় এবং রেফারেন্সটি আগে উপস্থিত না থাকলে স্ট্রিং পুলে রেফারেন্স তৈরি করতে এটি আপনাকে সহায়তা করে।

আপনি যখন ব্যবহার করেন String s = new String(hi), জাভা স্ট্রিংয়ের একটি নতুন উদাহরণ তৈরি করে, তবে আপনি যখন ব্যবহার করেন String s = "hi", জাভা কোডটিতে "হাই" শব্দের উদাহরণ আছে কিনা এবং তা উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখায় এটি কেবলমাত্র রেফারেন্সটি ফিরিয়ে দেয়।

যেহেতু স্ট্রিংগুলির তুলনা রেফারেন্সের উপর ভিত্তি করে, intern()আপনাকে একটি রেফারেন্স তৈরি করতে সহায়তা করে এবং স্ট্রিংয়ের বিষয়বস্তুগুলির তুলনা করতে আপনাকে সহায়তা করে।

আপনি যখন intern()কোডটি ব্যবহার করেন, এটি একই বস্তুর উল্লেখ করে স্ট্রিং দ্বারা ব্যবহৃত স্থানটি পরিষ্কার করে এবং মেমরিতে ইতিমধ্যে বিদ্যমান একই বস্তুর রেফারেন্স প্রদান করে।

আপনি যখন ব্যবহার করছেন তখন পি 5 এর ক্ষেত্রে:

String p5 = new String(p3);

কেবল p3 এর বিষয়বস্তু অনুলিপি করা হয়েছে এবং p5 সদ্য নির্মিত হয়েছে। সুতরাং এটি অভ্যন্তরীণ হয় না ।

সুতরাং আউটপুট হবে:

p1 and p2 are the same
p1 and p3 are the same
p1 and p4 are the same
p1 and p6 are the same when intern is used
p1 and p7 are the same

2
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s1 = "test";
    String s2 = new String("test");
    System.out.println(s1==s2);              //false
    System.out.println(s1==s2.intern());    //true --> because this time compiler is checking from string constant pool.
}

1

স্ট্রিং ইন্টার্ন () পদ্ধতিটি স্ট্রিং ধ্রুবক পুলে হিপ স্ট্রিং অবজেক্টের সঠিক কপি তৈরি করতে ব্যবহৃত হয়। স্ট্রিং ধ্রুবক পুলের স্ট্রিং অবজেক্টগুলি স্বয়ংক্রিয়ভাবে অভ্যন্তরীণ হয় তবে স্তূপে স্ট্রিং অবজেক্টগুলি হয় না। ইন্টার্ন তৈরির প্রধান ব্যবহার হ'ল মেমরির স্থানটি সংরক্ষণ করা এবং স্ট্রিং অবজেক্টগুলির সাথে দ্রুত তুলনা করা।

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


1

আপনি যেমন বলেছিলেন, সেই স্ট্রিং intern()পদ্ধতিটি প্রথমে স্ট্রিং পুল থেকে সন্ধান করবে, যদি এটি সন্ধান করে, তবে এটি যে পয়েন্টটি নির্দেশ করে সেই বস্তুটি ফিরিয়ে দেবে, বা পুলটিতে একটি নতুন স্ট্রিং যুক্ত করবে।

    String s1 = "Hello";
    String s2 = "Hello";
    String s3 = "Hello".intern();
    String s4 = new String("Hello");

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

s1এবং s2স্ট্রিং পুকুর "হ্যালো" নির্দেশিত, এবং ব্যবহার দুটি বস্তুর হয় "Hello".intern()যে পাবেন s1এবং s2। সুতরাং "s1 == s3"সত্য হিসাবে, পাশাপাশি s3.intern()


এটি আসলে খুব বেশি নতুন তথ্য সরবরাহ করে না। ইতিমধ্যে একটি ব্যতীত উত্তর আছে।
আলেকজান্ডার

0

হ্যাপ অবজেক্ট রেফারেন্স ব্যবহার করে যদি আমরা সংশ্লিষ্ট হতে চাই স্ট্রিং ধ্রুবক পুল অবজেক্ট রেফারেন্স , তবে আমাদের ইন্টার্নের জন্য যেতে হবে ()

String s1 = new String("Rakesh");
String s2 = s1.intern();
String s3 = "Rakesh";

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

পিকচারাল ভিউ এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 1: তথ্য 'রাকেশ' দিয়ে অবজেক্টটি হিপ এবং স্ট্রিং ধ্রুবক পুলে তৈরি হবে। এছাড়াও এস 1 সর্বদা হ্যাপ অবজেক্টের দিকে নির্দেশ করে।

ধাপ ২: হিপ অবজেক্ট রেফারেন্স এস 1 ব্যবহার করে আমরা ইন্টার্ন () ব্যবহার করে সংশ্লিষ্ট স্ট্রিং ধ্রুবক পুল অবজেক্ট রেফারেন্স এস 2 পাওয়ার চেষ্টা করছি are

পদক্ষেপ 3: ইচ্ছাকৃতভাবে স্ট্রিং ধ্রুবক পুলে ডেটা 'রাকেশ' দিয়ে একটি অবজেক্ট তৈরি করা হচ্ছে, নাম s3 দ্বারা রেফারেন্স করা

হিসাবে "==" অপারেটর রেফারেন্স তুলনা জন্য বোঝানো।

মিথ্যা হচ্ছে == এস 2 এর জন্য

সত্য হচ্ছে S2 == S3 জন্য

এই সাহায্য আশা করি !!

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