উত্তর:
পার্থক্য পার্থক্য:
Stringহয় অপরিবর্তনীয় , যদি আপনি তাদের মান পরিবর্তন করার চেষ্টা করুন, অন্য বস্তুর নির্মিত পরার, যেহেতু StringBufferএবং StringBuilderহয় চপল যাতে তারা তাদের মান পরিবর্তন করতে পারেন।
থ্রেড-সুরক্ষা পার্থক্য:
মধ্যে পার্থক্য StringBufferএবং StringBuilderযে StringBufferথ্রেড-নিরাপদ। সুতরাং যখন অ্যাপ্লিকেশনটি কেবল একটি থ্রেডে চালানো দরকার তখন ব্যবহার করা ভাল StringBuilder। StringBuilderতুলনায় আরও দক্ষ StringBuffer।
পরিস্থিতি:
Stringবস্তু অপরিবর্তনীয়।StringBuilderযথেষ্ট ভাল।StringBufferকারণ StringBufferসমকালীন তাই আপনার থ্রেড-সুরক্ষা রয়েছে।Stringsআমরা যখন মান পরিবর্তন করি তখন অন্য একটি বস্তু তৈরি হয়। পুরানো অবজেক্টের রেফারেন্সটি কি বাতিল করা হয়েছে যাতে এটি আবর্জনা সংগ্রহ করতে পারে GCবা এটি এমনকি আবর্জনাও সংগ্রহ করা যায়?
Stringসাথে সমস্ত পদ্ধতি ব্যবহার করতে পারি StringBuilder?
Stringযখন আপনি একটি পরিবর্তনীয় কাঠামো উপযুক্ত তখন ব্যবহার করেন ; একটি থেকে একটি নতুন চরিত্রের সিকোয়েন্স Stringগ্রহণযোগ্যতাযুক্ত পারফরম্যান্স পেনাল্টি বহন করতে পারে, হয় সিপিইউ সময় বা মেমরিতে (সাবস্ট্রিংগুলি প্রাপ্ত সিপিইউ দক্ষ কারণ ডেটা অনুলিপি করা হয়নি, তবে এর অর্থ সম্ভবত সম্ভাব্য পরিমাণে আরও বড় পরিমাণে বরাদ্দ থাকতে পারে)।StringBuilderযখন কোনও পরিবর্তনীয় চরিত্রের অনুক্রম তৈরি করতে চান তখন সাধারণত আপনি কয়েকটি অক্ষর ক্রম একসাথে যুক্ত করতে পারেন।StringBufferযে পরিস্থিতিতে ব্যবহার করবেন সেই একই পরিস্থিতিতে আপনি ব্যবহার StringBuilderকরবেন তবে অন্তর্নিহিত স্ট্রিংয়ের পরিবর্তনগুলি সিঙ্ক্রোনাইজ করতে হবে (কারণ বেশ কয়েকটি থ্রেড স্ট্রিং বাফারটি পড়ছে / সংশোধন করছে)।এখানে একটি উদাহরণ দেখুন ।
অধিকার:
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()ফিক্সড ফরম্যাটেড আউটপুট তৈরি করার সময়ও ভুলে যাবেন না , যেগুলি সংকলক আরও ভাল করে তুলতে পারে তা কম্পাইলার দ্বারা অনুকূলিত করা যায়।
String x = "A" + "B";স্ট্রিংবিল্ডার হওয়ার জন্য কি সত্যই সংকলন করে? এটি কেবল সংকলন করবে না কেন String x = "AB";, সংকলনের সময় উপাদানগুলি জানা না থাকলে এটি কেবল স্ট্রিংবিল্ডার ব্যবহার করা উচিত।
আপনি বোঝাতে চান?
বাস্তব বিশ্বের উদাহরণ: আপনি অন্য অনেকের মধ্যে একটি নতুন স্ট্রিং তৈরি করতে চান ।
উদাহরণস্বরূপ একটি বার্তা প্রেরণ:
দড়ি
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
StringBuilderঅ্যাসাইনমেন্টের ডান হাতের স্ট্রিং কনক্যাটনেটেশন ব্যবহার করা সাধারণত একটি ভাল অনুশীলন নয় । যে কোনও ভাল বাস্তবায়ন আপনার কথা অনুসারে দৃশ্যের পিছনে একটি স্ট্রিংবিল্ডার ব্যবহার করবে। তদ্ব্যতীত, আপনার উদাহরণ "a" + "b"একটি একক আক্ষরিক মধ্যে কম্পাইল করা হবে "ab"কিন্তু আপনি যদি ব্যবহৃত StringBuilderএটি দুই অপ্রয়োজনীয় কল স্থাপিত হবে append()।
"a"+"b"কিন্তু এটি সম্পর্কে স্পষ্টভাবে পরিবর্তিত করার বিষয়ে একটি স্ট্রিং কনকেন্টেশন কী ছিল তা বলার জন্য। আপনি যা বলেন না তা হ'ল এটি করা ভাল অভ্যাস নয়। এটিই (আধুনিক) সংকলক করে। @ ফাজি, আমি সম্মত, বিশেষত যখন আপনি জানবেন যে চূড়ান্ত স্ট্রিংয়ের আকারটি হবে (এপ্রোক্স)।
-------------------------------------------------- --------------------------------
স্ট্রিং স্ট্রিংবফার স্ট্রিংবিল্ডার
-------------------------------------------------- --------------------------------
স্টোরেজ এরিয়া | কনস্ট্যান্ট স্ট্রিং পুলের গাদা
পরিবর্তনযোগ্য | না (পরিবর্তনযোগ্য) হ্যাঁ (পরিবর্তনযোগ্য) হ্যাঁ (পরিবর্তনযোগ্য)
থ্রেড নিরাপদ | হ্যাঁ হ্যাঁ না
পারফরম্যান্স | দ্রুত খুব ধীর গতিতে
-------------------------------------------------- --------------------------------
synchronisedসে কারণেই ।
দড়ি
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);
আপনি যদি প্রতিবার মানটি সংশোধন করতে যাচ্ছেন তবে স্ট্রিংবুডারের জন্য যান যা স্ট্রিংবফারের চেয়ে দ্রুত। যদি একাধিক থ্রেড মান পরিবর্তন করে তবে স্ট্রিংবুফারের জন্য যান।
এছাড়াও, StringBufferথ্রেড-নিরাপদ, যা StringBuilderনা।
সুতরাং একটি বাস্তব-সময়ের পরিস্থিতিতে যখন বিভিন্ন থ্রেড এতে অ্যাক্সেস করছে তখন StringBuilderএকটি নির্বিচার সিদ্ধান্ত গ্রহণ করতে পারে।
মনে রাখবেন যে আপনি যদি জাভা 5 বা আরও নতুন ব্যবহার করছেন তবে আপনার StringBuilderপরিবর্তে ব্যবহার করা উচিত StringBuffer। এপিআই ডকুমেন্টেশন থেকে:
মুক্তি 5 জেডিকে হিসাবে, এই ক্লাসটি একটি একক থ্রেড দ্বারা ব্যবহারের জন্য ডিজাইন করা সমতুল্য শ্রেণীর সাথে পরিপূরক করা হয়েছে
StringBuilder,।StringBuilderশ্রেণী সাধারণত, এই এক পরিবর্তে ব্যবহার করা উচিত যেমন একই অপারেশনের সব সমর্থন কিন্তু এটা, দ্রুত হিসাবে এটি কোন সিঙ্ক্রোনাইজেশন সম্পাদন করে।
অনুশীলনে, আপনি প্রায় একই সময়ে একাধিক থ্রেড থেকে এটি কখনও ব্যবহার করতে পারবেন না, তাই সিঙ্ক্রোনাইজেশন যা StringBufferপ্রায়শই অপ্রয়োজনীয় ওভারহেড।
ব্যক্তিগতভাবে, আমি মনে করি না যে এটির জন্য আসল বিশ্বের ব্যবহার রয়েছে StringBuffer। আমি কখন অক্ষরের ক্রমটি পরিচালনা করে একাধিক থ্রেডের মধ্যে যোগাযোগ করতে চাই? এটি মোটেও কার্যকর বলে মনে হচ্ছে না, তবে সম্ভবত আমি এখনও আলো দেখতে পেলাম না :)
স্ট্রিং এবং অন্যান্য দুটি শ্রেণীর মধ্যে পার্থক্য হ'ল স্ট্রিং অপরিবর্তনীয় এবং অন্য দুটি ক্লাস হ'ল পারস্পরিক পরিবর্তনযোগ্য ক্লাস।
কিন্তু কেন আমাদের একই উদ্দেশ্যে দুটি ক্লাস রয়েছে?
কারণটি StringBufferথ্রেড নিরাপদ এবং StringBuilderতা নয়।
StringBuilderএটি একটি নতুন ক্লাস StringBuffer Apiএবং এটি চালু হয়েছিল JDK5এবং আপনি যদি একটি একক থ্রেডযুক্ত পরিবেশে কাজ করছেন তবে এটির হিসাবে সর্বদা সুপারিশ করা হয়Faster
সম্পূর্ণ বিবরণের জন্য আপনি http://www.codingeek.com/java/stringbuilder-and-stringbuffer-a-way-to-create-mutable-strings-in-java/ পড়তে পারেন
জাভাতে, স্ট্রিং অপরিবর্তনীয়। অপরিবর্তনীয় হওয়ার অর্থ আমরা বোঝাতে চাইছি যে একবার স্ট্রিং তৈরি হয়ে গেলে আমরা এর মান পরিবর্তন করতে পারি না। স্ট্রিংবাফার পরিবর্তনযোগ্য। একবার স্ট্রিংবাফার অবজেক্টটি তৈরি হয়ে গেলে, আমরা কেবলমাত্র একটি নতুন অবজেক্ট তৈরির পরিবর্তে সামগ্রীর বস্তুর মানতে যুক্ত করব। স্ট্রিংবুডার স্ট্রিংবুফারের অনুরূপ তবে এটি থ্রেড-নিরাপদ নয়। স্টিংবিল্ডার পদ্ধতিগুলি সিঙ্ক্রোনাইজ করা হয় না তবে অন্যান্য স্ট্রিংসের তুলনায় স্ট্রিংবিল্ডার দ্রুততম রান করে। আপনি স্ট্রিং, স্ট্রিংবিল্ডার এবং স্ট্রিংবফার এগুলি প্রয়োগ করে তাদের মধ্যে পার্থক্য শিখতে পারেন ।