স্ট্রিং, স্ট্রিংবফার এবং স্ট্রিংবুডার


213

দয়া করে আমাকে তুলনা করার জন্য একটি রিয়েল টাইমে অবস্থা বলতে String, StringBufferএবং StringBuilder?

উত্তর:


378

পার্থক্য পার্থক্য:

Stringহয় অপরিবর্তনীয় , যদি আপনি তাদের মান পরিবর্তন করার চেষ্টা করুন, অন্য বস্তুর নির্মিত পরার, যেহেতু StringBufferএবং StringBuilderহয় চপল যাতে তারা তাদের মান পরিবর্তন করতে পারেন।

থ্রেড-সুরক্ষা পার্থক্য:

মধ্যে পার্থক্য StringBufferএবং StringBuilderযে StringBufferথ্রেড-নিরাপদ। সুতরাং যখন অ্যাপ্লিকেশনটি কেবল একটি থ্রেডে চালানো দরকার তখন ব্যবহার করা ভাল StringBuilderStringBuilderতুলনায় আরও দক্ষ StringBuffer

পরিস্থিতি:

  • যদি আপনার স্ট্রিং একটি স্ট্রিং ক্লাস ব্যবহার করতে পরিবর্তন না করে কারণ কোনও Stringবস্তু অপরিবর্তনীয়।
  • যদি আপনার স্ট্রিং পরিবর্তন করতে পারে (উদাহরণস্বরূপ: স্ট্রিং নির্মাণে প্রচুর যুক্তি এবং কার্যকারিতা) এবং কেবলমাত্র একটি একক থ্রেড থেকে অ্যাক্সেস করা যায়, এটি ব্যবহার করে StringBuilderযথেষ্ট ভাল।
  • যদি আপনার স্ট্রিং পরিবর্তন হতে পারে এবং একাধিক থ্রেড থেকে অ্যাক্সেস করা হয়ে থাকে তবে এটি ব্যবহার করুন StringBufferকারণ StringBufferসমকালীন তাই আপনার থ্রেড-সুরক্ষা রয়েছে।

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

2
সুতরাং Stringsআমরা যখন মান পরিবর্তন করি তখন অন্য একটি বস্তু তৈরি হয়। পুরানো অবজেক্টের রেফারেন্সটি কি বাতিল করা হয়েছে যাতে এটি আবর্জনা সংগ্রহ করতে পারে GCবা এটি এমনকি আবর্জনাও সংগ্রহ করা যায়?
হর্ষ বর্ধন

@ পিটারওয়াননিকার্ক লজিক অপারেশন বলতে কী বোঝ?
emlai

লজিক অপারেশন বলতে আমি বলতে চাইছি বেসিক স্ট্রিংগুলি, এখন আমি একটি জিনিস জিজ্ঞাসা করতে চাই, @ পিটারের বক্তব্য অনুসারে স্ট্রিংয়ের পরিবর্তে সমস্ত ক্ষেত্রে স্ট্রিংবাফার ব্যবহার শুরু করা উচিত বা কিছু নির্দিষ্ট কেস আছে?
জাভাড্রেগন

@ বাকল আমি কি এর Stringসাথে সমস্ত পদ্ধতি ব্যবহার করতে পারি StringBuilder?
রুট ট্র্যাভেলার

47
  • Stringযখন আপনি একটি পরিবর্তনীয় কাঠামো উপযুক্ত তখন ব্যবহার করেন ; একটি থেকে একটি নতুন চরিত্রের সিকোয়েন্স Stringগ্রহণযোগ্যতাযুক্ত পারফরম্যান্স পেনাল্টি বহন করতে পারে, হয় সিপিইউ সময় বা মেমরিতে (সাবস্ট্রিংগুলি প্রাপ্ত সিপিইউ দক্ষ কারণ ডেটা অনুলিপি করা হয়নি, তবে এর অর্থ সম্ভবত সম্ভাব্য পরিমাণে আরও বড় পরিমাণে বরাদ্দ থাকতে পারে)।
  • আপনি StringBuilderযখন কোনও পরিবর্তনীয় চরিত্রের অনুক্রম তৈরি করতে চান তখন সাধারণত আপনি কয়েকটি অক্ষর ক্রম একসাথে যুক্ত করতে পারেন।
  • আপনি StringBufferযে পরিস্থিতিতে ব্যবহার করবেন সেই একই পরিস্থিতিতে আপনি ব্যবহার StringBuilderকরবেন তবে অন্তর্নিহিত স্ট্রিংয়ের পরিবর্তনগুলি সিঙ্ক্রোনাইজ করতে হবে (কারণ বেশ কয়েকটি থ্রেড স্ট্রিং বাফারটি পড়ছে / সংশোধন করছে)।

এখানে একটি উদাহরণ দেখুন ।


2
সংক্ষিপ্ত, তবে অসম্পূর্ণ, এটি স্ট্রিংবিল্ডার / বাফার ব্যবহারের মৌলিক কারণটিকে মিস করে এবং তা হ'ল নিয়মিত স্ট্রিং কনটেন্টেশন আচরণের পুনঃ-বরাদ্দ এবং অ্যারে অনুলিপি হ্রাস করা বা অপসারণ করা।

1
"আপনি যখন স্ট্রিং ব্যবহার করছেন তখন আপনি স্ট্রিং ব্যবহার করেন" - এর অর্থ নেই sense স্ট্রিংয়ের উদাহরণগুলি পরিবর্তনযোগ্য, তাই সম্ভবত মন্তব্যটিতে "স্ট্রিং ব্যবহার করুন যখন অপরিবর্তনীয়তার কারণে মেমরির ব্যবহারের বিষয়টি বিবেচনা করে না" পড়তে হবে। গৃহীত উত্তর এটির ঘাঁটিগুলি বেশ ভালভাবে কভার করে।
fooMonster

28

অধিকার:

Stringএকটি অপরিবর্তনীয় শ্রেণি, এটি পরিবর্তন করা যায় না। StringBuilderএকটি পরিবর্তনীয় শ্রেণি যা সংযোজনযোগ্য, অক্ষর প্রতিস্থাপন বা সরানো এবং শেষ পর্যন্ত একটিতে রূপান্তরিত String StringBufferহ'ল এর মূল সিঙ্ক্রোনাইজড সংস্করণStringBuilder

আপনার StringBuilderসমস্ত ক্ষেত্রেই আপনার পছন্দ করা উচিত যেখানে আপনার অবজেক্টটিতে অ্যাক্সেস কেবলমাত্র একটি এক থ্রেড রয়েছে।

বিস্তারিত:

এছাড়াও লক্ষ্য করুন যে StringBuilder/Buffersযাদু নয়, তারা কেবল একটি ব্যাকিং অবজেক্ট হিসাবে একটি অ্যারে ব্যবহার করে এবং যখন অ্যারেটি পূর্ণ হয় তখন পুনরায় বরাদ্দ করতে হয়। নিশ্চিত হয়ে নিন এবং আপনার StringBuilder/Bufferবস্তুগুলি মূলত যথেষ্ট পরিমাণে তৈরি করুন যেখানে প্রতিবার .append()ডাকা হওয়ার সাথে সাথে এগুলি ক্রমাগত পুনরায় আকার দিতে হবে না ।

পুনরায় আকার দেওয়ার ফলে খুব হ্রাস পেতে পারে। এটি মূলত ব্যাকিং অ্যারেটিকে বর্তমান আকারের 2 বার বাড়ানোর জন্য এটির পুনঃ আকার দেয়। এর ফলে StringBuilder/Bufferক্লাস যখন বড় হতে শুরু করে তখন প্রচুর পরিমাণে র‍্যাম বরাদ্দ হয়ে যায় এবং ব্যবহৃত হয় না ।

জাভাতে পর্দার আড়ালে String x = "A" + "B";একটি ব্যবহার StringBuilderকরে। সুতরাং সাধারণ ক্ষেত্রে নিজের ঘোষণা করার কোনও সুবিধা নেই। তবে যদি আপনি Stringবড় আকারের অবজেক্ট তৈরি করে চলেছেন তবে 4 কে এর চেয়ে কম বলুন, তবে ডিক্লেয়ারিং StringBuilder sb = StringBuilder(4096);কনটেনটেশন বা ডিফল্ট কনস্ট্রাক্টর যা কেবল ১ 16 টি অক্ষরের ব্যবহারের চেয়ে অনেক বেশি কার্যকর । যদি আপনার String10 কে এরও কম হয় তবে এটি নিরাপদ হওয়ার জন্য নির্মাতার সাথে এটি আরম্ভ করুন। তবে যদি এটি 10 ​​কে শুরু করা হয় তবে আপনি 10 কের চেয়ে বেশি 1 টি অক্ষর লিখবেন, এটি পুনরায় বরাদ্দ হবে এবং 20k অ্যারেতে অনুলিপি করা হবে। সুতরাং উচ্চ আরম্ভ করা কম চেয়ে ভাল।

স্বয়ংক্রিয় পুনরায় আকারের ক্ষেত্রে, 17 তম অক্ষরে ব্যাকিং অ্যারে পুনরায় বরাদ্দ হয়ে 32 ক্যারেক্টারে অনুলিপি করা হয়, 33 তম অক্ষরটিতে এটি আবার ঘটে এবং আপনি পুনরায় বরাদ্দ হয়ে অ্যারেটিকে 64 টি অক্ষরে অনুলিপি করতে পারেন। কীভাবে এই বিচ্যুত হয়ে দেখতে পারেন প্রচুর পুনরায় বরাদ্দ এবং কপি যা আপনি কি সত্যিই চেষ্টা করছেন ব্যবহার এড়াতে StringBuilder/Bufferপ্রথম স্থানে।

এটি বিমূর্ত স্ট্রিংবিল্ডারের জেডিকে 6 উত্স কোড থেকে

   void expandCapacity(int minimumCapacity) {
    int newCapacity = (value.length + 1) * 2;
        if (newCapacity < 0) {
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {
        newCapacity = minimumCapacity;
    }
        value = Arrays.copyOf(value, newCapacity);
    }

একটি সেরা অনুশীলন হ'ল আপনি StringBuilder/Bufferযদি মনে করেন যে আপনি প্রয়োজন হচ্ছেন তার থেকে কিছুটা বড়কে সূচনা করা আপনি যদি ডান হাতটি না জানেন তবে কী পরিমাণ বড় Stringহবে তবে আপনি অনুমান করতে পারেন। আপনার প্রয়োজনের তুলনায় সামান্য বেশি মেমরির একটি বরাদ্দকরণ প্রচুর পুনঃ-বরাদ্দ এবং অনুলিপিগুলির চেয়ে ভাল হতে চলেছে।

এছাড়াও স্ট্রিং + 16 অক্ষরের আকার বরাদ্দ করা হবে এমন একটি StringBuilder/Bufferদিয়ে আরম্ভ করার বিষয়ে সতর্ক থাকুন String, যা বেশিরভাগ ক্ষেত্রে আপনি কেবল অবনতি পুনরায় বরাদ্দ এবং কপি চক্রটি শুরু করবেন যা আপনি এড়াতে চাইছেন। নিম্নলিখিতটি সরাসরি জাভা 6 উত্স কোড থেকে প্রাপ্ত।

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
    }

যদি আপনি যথাযথভাবে StringBuilder/Bufferএমন কোনও উদাহরণ দিয়ে শেষ করেন যা আপনি তৈরি করেন নি এবং যে কনস্ট্রাক্টর নামে ডাকা হয় তাকে নিয়ন্ত্রণ করতে পারবেন না, হ্রাস পাওয়ার পুনরায় বরাদ্দ এবং অনুলিপি আচরণ এড়ানোর একটি উপায় রয়েছে। .ensureCapacity()আপনার ফলাফলটি Stringউপযুক্ত হবে তা নিশ্চিত করতে আপনি যে আকারটি চান তার সাথে কল করুন ।

বিকল্পগুলি:

ঠিক যেমন একটি নোট, যদি আপনি সত্যিই ভারী String বিল্ডিং এবং ম্যানিপুলেশন করছেন তবে রোপস নামে আরও অনেক কার্যকারিতা ভিত্তিক বিকল্প রয়েছে ।

অন্য বিকল্পটি হ'ল StringListউপ-শ্রেণিবদ্ধকরণের মাধ্যমে একটি প্রয়োগ তৈরি করা এবং তালিকার ArrayList<String>প্রতিটি .append()এবং অন্যান্য মিউটেশন অপারেশনগুলিতে অক্ষরের সংখ্যা ট্র্যাক করার জন্য কাউন্টার যুক্ত করা , তারপরে তালিকার মধ্য দিয়ে আপনার প্রয়োজনীয় আকার এবং লুপটি .toString()তৈরি করতে ওভাররাইড করুন StringBuilderআউটপুট, আপনি এমনকি StringBuilderএকটি দৃষ্টান্ত পরিবর্তনশীল এবং 'ক্যাশে' এর ফলাফল .toString()তৈরি করতে পারেন এবং কিছু পরিবর্তন হলে এটি পুনরায় তৈরি করতে হয়।

String.format()ফিক্সড ফরম্যাটেড আউটপুট তৈরি করার সময়ও ভুলে যাবেন না , যেগুলি সংকলক আরও ভাল করে তুলতে পারে তা কম্পাইলার দ্বারা অনুকূলিত করা যায়।


1
String x = "A" + "B";স্ট্রিংবিল্ডার হওয়ার জন্য কি সত্যই সংকলন করে? এটি কেবল সংকলন করবে না কেন String x = "AB";, সংকলনের সময় উপাদানগুলি জানা না থাকলে এটি কেবল স্ট্রিংবিল্ডার ব্যবহার করা উচিত।
ম্যাট গ্রেয়ার

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

আমি স্ট্রিং.ফর্ম্যাট () সম্পর্কে ভাবছিলাম। আমি কখনও সত্যিই এটি প্রকল্পে ব্যবহার করা হয় নি। সাধারণত এটি স্ট্রিংবিল্ডার। ভাল, সাধারণত এটি আসলে "এ" + "বি" + "সি" কারণ লোকেরা অলস;) আমি সবসময় স্ট্রিংবিল্ডার ব্যবহার করার ঝোঁক ছিলাম, যদিও এটি দুটি মাত্র স্ট্রিংকে সংশ্লেষিত করা হয়েছিল, কারণ ভবিষ্যতে সম্ভবত আরও স্ট্রিং সংযুক্ত করা হবে । আমি স্ট্রিং.ফর্ম্যাট () কখনই ব্যবহার করি নি, কারণ এটি কখনই জেডিকে চালু হয়েছিল তা আমি কখনও মনে করি নি - আমি এটি জেডিকে ১.৫ দেখছি, আমি এটি অন্য বিকল্পের পক্ষে ব্যবহার করব।
জ্যামিবারো

9

আপনি বোঝাতে চান?

বাস্তব বিশ্বের উদাহরণ: আপনি অন্য অনেকের মধ্যে একটি নতুন স্ট্রিং তৈরি করতে চান

উদাহরণস্বরূপ একটি বার্তা প্রেরণ:

দড়ি

String s = "Dear " + user.name + "<br>" + 
" I saw your profile and got interested in you.<br>" +
" I'm  " + user.age + "yrs. old too"

StringBuilder

String s = new StringBuilder().append.("Dear ").append( user.name ).append( "<br>" ) 
          .append(" I saw your profile and got interested in you.<br>") 
          .append(" I'm  " ).append( user.age ).append( "yrs. old too")
          .toString()

অথবা

String s = new StringBuilder(100).appe..... etc. ...
// The difference is a size of 100 will be allocated upfront as  fuzzy lollipop points out.

স্ট্রিংবুফার (সিনট্যাক্সটি স্ট্রিংবিল্ডারের মতোই, প্রভাবগুলি পৃথক করে)

সম্পর্কিত

StringBuffer বনাম StringBuilder

প্রাক্তনটি সিঙ্ক হয়েছে এবং পরে তা নয়।

সুতরাং, আপনি যদি একাধিক বার এটি একটি থ্রেডে StringBuilderচালিত করেন (যা 90% ক্ষেত্রে হয়) তবে এটি খুব দ্রুত চলবে কারণ এটি থ্রেড লকের মালিক কিনা তা দেখতে থামবে না।

সুতরাং, এটি ব্যবহার করার পরামর্শ দেওয়া হয় StringBuilder(যদি না আপনি একই সময়ে একাধিক থ্রেড অ্যাক্সেস করেন তবে এটি বিরল)

Stringসংক্ষিপ্তকরণ ( + অপারেটর ব্যবহার করে ) StringBuilderনীচের ব্যবহারের জন্য সংকলকটি অনুকূলিত হতে পারে , সুতরাং, জাভা-র প্রবীণ সময়ে, এটি নিয়ে চিন্তার কিছু নয়, যা প্রত্যেককে বলে যে কোনও মূল্যে এড়ানো উচিত, কারণ প্রতিটি যুক্তিযুক্তি একটি নতুন স্ট্রিং অবজেক্ট তৈরি করেছে। আধুনিক সংকলকগণ এটি আর করেন না তবে StringBuilderআপনি যদি "পুরানো" সংকলক ব্যবহার করেন তবে পরিবর্তে এটি ব্যবহার করা ভাল অভ্যাস ।

সম্পাদন করা

যারা কৌতূহলী, কেবল এই শ্রেণীর জন্য সংকলক এটি করে:

class StringConcatenation {
    int x;
    String literal = "Value is" + x;
    String builder = new StringBuilder().append("Value is").append(x).toString();
}

javap -c স্ট্রিংকন্টেশনেশন

Compiled from "StringConcatenation.java"
class StringConcatenation extends java.lang.Object{
int x;

java.lang.String literal;

java.lang.String builder;

StringConcatenation();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   new #2; //class java/lang/StringBuilder
   8:   dup
   9:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   12:  ldc #4; //String Value is
   14:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   17:  aload_0
   18:  getfield    #6; //Field x:I
   21:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   24:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   27:  putfield    #9; //Field literal:Ljava/lang/String;
   30:  aload_0
   31:  new #2; //class java/lang/StringBuilder
   34:  dup
   35:  invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   38:  ldc #4; //String Value is
   40:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   43:  aload_0
   44:  getfield    #6; //Field x:I
   47:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   50:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   53:  putfield    #10; //Field builder:Ljava/lang/String;
   56:  return

}

5 - 27 নম্বরযুক্ত রেখাগুলি "আক্ষরিক" নামের স্ট্রিংয়ের জন্য

31-53 নম্বরযুক্ত রেখাগুলি "নির্মাতা" নামের স্ট্রিংয়ের জন্য

উভয় স্ট্রিংয়ের জন্য ঠিক একই কোডটি কার্যকর করা হয় The


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

1
StringBuilderঅ্যাসাইনমেন্টের ডান হাতের স্ট্রিং কনক্যাটনেটেশন ব্যবহার করা সাধারণত একটি ভাল অনুশীলন নয় । যে কোনও ভাল বাস্তবায়ন আপনার কথা অনুসারে দৃশ্যের পিছনে একটি স্ট্রিংবিল্ডার ব্যবহার করবে। তদ্ব্যতীত, আপনার উদাহরণ "a" + "b"একটি একক আক্ষরিক মধ্যে কম্পাইল করা হবে "ab"কিন্তু আপনি যদি ব্যবহৃত StringBuilderএটি দুই অপ্রয়োজনীয় কল স্থাপিত হবে append()
পিটারসকে চিহ্নিত করুন

@ মার্ক আমার ব্যবহারের অর্থ ছিল না "a"+"b"কিন্তু এটি সম্পর্কে স্পষ্টভাবে পরিবর্তিত করার বিষয়ে একটি স্ট্রিং কনকেন্টেশন কী ছিল তা বলার জন্য। আপনি যা বলেন না তা হ'ল এটি করা ভাল অভ্যাস নয়। এটিই (আধুনিক) সংকলক করে। @ ফাজি, আমি সম্মত, বিশেষত যখন আপনি জানবেন যে চূড়ান্ত স্ট্রিংয়ের আকারটি হবে (এপ্রোক্স)।
অস্কাররাজ

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

@ মার্ক এটি পেয়েছে আমি "টেমপ্লেটের মতো কোডের বড় অংশ" এবং আরও নিয়মিত প্রতিটি নিয়মিত স্ট্রিংয়ে না হয়ে আরও ভাবছিলাম । তবে হ্যাঁ, আমি একমত, যেহেতু আজকাল তারা একই কাজ করে, এটি কোনও
অর্থবোধ

8
-------------------------------------------------- --------------------------------
                  স্ট্রিং স্ট্রিংবফার স্ট্রিংবিল্ডার
-------------------------------------------------- --------------------------------                 
স্টোরেজ এরিয়া | কনস্ট্যান্ট স্ট্রিং পুলের গাদা
পরিবর্তনযোগ্য | না (পরিবর্তনযোগ্য) হ্যাঁ (পরিবর্তনযোগ্য) হ্যাঁ (পরিবর্তনযোগ্য)
থ্রেড নিরাপদ | হ্যাঁ হ্যাঁ না
 পারফরম্যান্স | দ্রুত খুব ধীর গতিতে
-------------------------------------------------- --------------------------------

স্ট্রিংয়ের পারফরম্যান্স কেন দ্রুত এবং স্ট্রিংবফার পারফরম্যান্স খুব ধীর?
গৌরব

1
@ গৌরব আপনি এর উত্স কোডটি পড়তে পারেন, স্ট্রিংবুফারের সমস্ত পদ্ধতি এবং synchronisedসে কারণেই
হেরেন

8

স্ট্রিং পরিবার

দড়ি

String classঅক্ষর স্ট্রিং প্রতিনিধিত্ব করে। জাভা প্রোগ্রামের সমস্ত স্ট্রিং আক্ষরিক যেমন "abc"এই শ্রেণীর উদাহরণ হিসাবে প্রয়োগ করা হয়।

স্ট্রিং বস্তু অপরিবর্তনীয় একবার তারা নির্মিত আমরা পরিবর্তন করতে পারবেন না। ( স্ট্রিংগুলি ধ্রুবক হয় )

  • কনস্ট্রাক্টর বা পদ্ধতি ব্যবহার করে যদি একটি স্ট্রিং তৈরি করা হয় তবে সেই স্ট্রিংগুলি হ্যাপ মেমোরিতে পাশাপাশি সংরক্ষণ করা হবে SringConstantPool। তবে পুলে সংরক্ষণের আগে এটি intern()সমান পদ্ধতি ব্যবহার করে পুলের একই সামগ্রীর সাথে অবজেক্টের উপলব্ধতার পরীক্ষা করার জন্য পদ্ধতিটি আহ্বান করে। পুলটিতে স্ট্রিং-অনুলিপি উপলব্ধ থাকলে রেফারেন্সটি দেয়। অন্যথায়, স্ট্রিং অবজেক্টটি পুলটিতে যুক্ত করা হয় এবং রেফারেন্সটি দেয়।

    • জাভা ভাষা স্ট্রিং কনক্যান্টেশন অপারেটর ( +) এবং অন্যান্য বস্তুকে স্ট্রিংয়ে রূপান্তর করার জন্য বিশেষ সহায়তা সরবরাহ করে। স্ট্রিংবিল্ডার (বা স্ট্রিংবফার) শ্রেণি এবং এর সংযোজন পদ্ধতির মাধ্যমে স্ট্রিং কনটেনটেশন প্রয়োগ করা হয়।

    String heapSCP = new String("Yash");
    heapSCP.concat(".");
    heapSCP = heapSCP + "M";
    heapSCP = heapSCP + 777;
    
    // For Example: String Source Code 
    public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        int len = value.length;
        char buf[] = Arrays.copyOf(value, len + otherLen);
        str.getChars(buf, len);
        return new String(buf, true);
    }
  • স্ট্রিং আক্ষরিক সংরক্ষণ করা হয় StringConstantPool

    String onlyPool = "Yash";

স্ট্রিংবিল্ডার এবং স্ট্রিংবফার হ'ল অক্ষরগুলির পরিবর্তনীয় ক্রম। তার মানে যে কেউ এই বস্তুর মান পরিবর্তন করতে পারে। স্ট্রিংবুফারের স্ট্রিংবুডার হিসাবে একই পদ্ধতি রয়েছে তবে স্ট্রিংবুফারের প্রতিটি পদ্ধতি সিঙ্ক্রোনাইজ করা হয় তাই এটি থ্রেড নিরাপদ।

  • স্ট্রিংবুফার এবং স্ট্রিংবিল্ডার ডেটা কেবলমাত্র নতুন অপারেটর ব্যবহার করে তৈরি করা যায়। সুতরাং, তারা হিপ মেমরিতে সঞ্চিত হয়।

  • স্ট্রিংবিল্ডারের উদাহরণগুলি একাধিক থ্রেড দ্বারা ব্যবহারের জন্য নিরাপদ নয়। যদি এই জাতীয় সিঙ্ক্রোনাইজেশন প্রয়োজন হয় তবে স্ট্রিংবুফার ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।

    StringBuffer threadSafe = new StringBuffer("Yash");
    threadSafe.append(".M");
    threadSafe.toString();
    
    StringBuilder nonSync = new StringBuilder("Yash");
    nonSync.append(".M");
    nonSync.toString();
  • স্ট্রিংবাফার এবং স্ট্রিংবিল্ডারের কাছে।, replace(int start, int end, String str)এবং এর মতো একটি বিশেষ পদ্ধতি রয়েছে reverse()

    দ্রষ্টব্য : স্ট্রিংবুফার এবং স্রিংবিল্ডার পরিবর্তিত হয় কারণ তারা এর বাস্তবায়ন সরবরাহ করে Appendable Interface


কখন কোনটি ব্যবহার করবেন।

  • যদি আপনি প্রতিবার মান পরিবর্তন না করে থাকেন তবে এটি ব্যবহার করা আরও ভাল String Class। জেনারিকসের অংশ হিসাবে আপনি যদি Comparable<T>কোনও মান বাছাই করতে বা তুলনা করতে চান তবে যান String Class

    //ClassCastException: java.lang.StringBuffer cannot be cast to java.lang.Comparable
    Set<StringBuffer> set = new TreeSet<StringBuffer>();
    set.add( threadSafe );
    System.out.println("Set : "+ set);
  • আপনি যদি প্রতিবার মানটি সংশোধন করতে যাচ্ছেন তবে স্ট্রিংবুডারের জন্য যান যা স্ট্রিংবফারের চেয়ে দ্রুত। যদি একাধিক থ্রেড মান পরিবর্তন করে তবে স্ট্রিংবুফারের জন্য যান।


4

এছাড়াও, StringBufferথ্রেড-নিরাপদ, যা StringBuilderনা।

সুতরাং একটি বাস্তব-সময়ের পরিস্থিতিতে যখন বিভিন্ন থ্রেড এতে অ্যাক্সেস করছে তখন StringBuilderএকটি নির্বিচার সিদ্ধান্ত গ্রহণ করতে পারে।


3

মনে রাখবেন যে আপনি যদি জাভা 5 বা আরও নতুন ব্যবহার করছেন তবে আপনার StringBuilderপরিবর্তে ব্যবহার করা উচিত StringBuffer। এপিআই ডকুমেন্টেশন থেকে:

মুক্তি 5 জেডিকে হিসাবে, এই ক্লাসটি একটি একক থ্রেড দ্বারা ব্যবহারের জন্য ডিজাইন করা সমতুল্য শ্রেণীর সাথে পরিপূরক করা হয়েছে StringBuilder,। StringBuilderশ্রেণী সাধারণত, এই এক পরিবর্তে ব্যবহার করা উচিত যেমন একই অপারেশনের সব সমর্থন কিন্তু এটা, দ্রুত হিসাবে এটি কোন সিঙ্ক্রোনাইজেশন সম্পাদন করে।

অনুশীলনে, আপনি প্রায় একই সময়ে একাধিক থ্রেড থেকে এটি কখনও ব্যবহার করতে পারবেন না, তাই সিঙ্ক্রোনাইজেশন যা StringBufferপ্রায়শই অপ্রয়োজনীয় ওভারহেড।


3

ব্যক্তিগতভাবে, আমি মনে করি না যে এটির জন্য আসল বিশ্বের ব্যবহার রয়েছে StringBuffer। আমি কখন অক্ষরের ক্রমটি পরিচালনা করে একাধিক থ্রেডের মধ্যে যোগাযোগ করতে চাই? এটি মোটেও কার্যকর বলে মনে হচ্ছে না, তবে সম্ভবত আমি এখনও আলো দেখতে পেলাম না :)


3

স্ট্রিং এবং অন্যান্য দুটি শ্রেণীর মধ্যে পার্থক্য হ'ল স্ট্রিং অপরিবর্তনীয় এবং অন্য দুটি ক্লাস হ'ল পারস্পরিক পরিবর্তনযোগ্য ক্লাস।

কিন্তু কেন আমাদের একই উদ্দেশ্যে দুটি ক্লাস রয়েছে?

কারণটি StringBufferথ্রেড নিরাপদ এবং StringBuilderতা নয়। StringBuilderএটি একটি নতুন ক্লাস StringBuffer Apiএবং এটি চালু হয়েছিল JDK5এবং আপনি যদি একটি একক থ্রেডযুক্ত পরিবেশে কাজ করছেন তবে এটির হিসাবে সর্বদা সুপারিশ করা হয়Faster

সম্পূর্ণ বিবরণের জন্য আপনি http://www.codingeek.com/java/stringbuilder-and-stringbuffer-a-way-to-create-mutable-strings-in-java/ পড়তে পারেন


2

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

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