মধ্যে মূল পার্থক্য কি StringBufferএবং StringBuilder? এর যে কোনও একটিতে সিদ্ধান্ত নেওয়ার সময় কোনও পারফরম্যান্স সমস্যা আছে?
মধ্যে মূল পার্থক্য কি StringBufferএবং StringBuilder? এর যে কোনও একটিতে সিদ্ধান্ত নেওয়ার সময় কোনও পারফরম্যান্স সমস্যা আছে?
উত্তর:
StringBufferসিঙ্ক্রোনাইজ করা হয়, StringBuilderহয় না।
StringBuilderStringBufferএটি না হওয়ার চেয়ে দ্রুত synchronized।
এখানে একটি সাধারণ মানদণ্ড পরীক্ষা:
public class Main {
public static void main(String[] args) {
int N = 77777777;
long t;
{
StringBuffer sb = new StringBuffer();
t = System.currentTimeMillis();
for (int i = N; i --> 0 ;) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
{
StringBuilder sb = new StringBuilder();
t = System.currentTimeMillis();
for (int i = N; i > 0 ; i--) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
}
}
একটি পরীক্ষা রান সংখ্যা দেয় 2241 msজন্য StringBufferবনাম 753 msজন্য StringBuilder।
--> 0লুপ দেখতে । এর অর্থ কী তা বোঝার জন্য আমাকে এক মুহূর্ত নিল। এটি কি এমন কিছু যা বাস্তবে স্বাভাবিক ...; i > 0; i--সিনট্যাক্সের পরিবর্তে ব্যবহার করা হয় ?
i -->সত্যিই বিরক্তিকর সিনট্যাক্স প্রজ্ঞাময় ... আমি ভেবেছিলাম এটা হওয়া ASCII শিল্প সম্পর্কে মন্তব্য কারণে প্রথমে একটি তীর ছিল।
main()অন্যায্য। কোন উষ্ণতা নেই।
মূলত, StringBufferপদ্ধতিগুলি যখন সিঙ্ক্রোনাইজ হয় তখনStringBuilder না থাকে হয়।
অপারেশনগুলি "প্রায়" একই, তবে একক থ্রেডে সিঙ্ক্রোনাইজড পদ্ধতি ব্যবহার করা ওভারকিল।
এটি সম্পর্কে বেশ।
স্ট্রিংবিল্ডার এপিআইয়ের উদ্ধৃতি :
এই শ্রেণি [স্ট্রিংবুডার] স্ট্রিংবুফারের সাথে সামঞ্জস্যপূর্ণ একটি এপিআই সরবরাহ করে তবে সিঙ্ক্রোনাইজেশনের কোনও গ্যারান্টি ছাড়াই । এই ক্লাসটি স্ট্রিংবাফারের জন্য ড্রপ-ইন প্রতিস্থাপন হিসাবে যে জায়গাগুলিতে স্ট্রিং বাফারটি একক থ্রেড দ্বারা ব্যবহৃত হয়েছিল (যেমন সাধারণভাবে হয়) ব্যবহারের জন্য তৈরি করা হয়েছে। যেখানে সম্ভব, এটি সুপারিশ করা হয় যে এই শ্রেণিটি স্ট্রিংবাফারকে অগ্রাধিকার হিসাবে ব্যবহার করা উচিত কারণ এটি বেশিরভাগ বাস্তবায়নের অধীনে দ্রুততর হবে।
সুতরাং এটি এর বিকল্প তৈরি করা হয়েছিল।
একই ঘটনা ঘটেছে Vectorএবং এর সাথেও ArrayList।
Hashtableএবং HashMap।
কিন্তু একটি উদাহরণের সাহায্যে স্পষ্ট পার্থক্য পাওয়া দরকার?
স্ট্রিংবুফার বা স্ট্রিংবিল্ডার
StringBuilderআপনি যদি থ্রেডগুলির মধ্যে বাফারটি ভাগ করে নেওয়ার চেষ্টা না করেন তবে সহজেই ব্যবহার করুন । StringBuilderআসল সিঙ্ক্রোনাইজ করা StringBufferশ্রেণীর ছোট ভাই হ'ল অবিচ্ছিন্ন (কম ওভারহেড = আরও দক্ষ) ।
StringBufferপ্রথম এসেছিল। সূর্য সমস্ত অবস্থার অধীনে নির্ভুলতার সাথে উদ্বিগ্ন ছিল, তাই তারা কেবল এটি ক্ষেত্রে থ্রেড-নিরাপদ করে তুলতে এটি সিঙ্ক্রোনাইজ করেছিল।
StringBuilderপরে এসেছিল। এর বেশিরভাগ ব্যবহারStringBuffer একক থ্রেড ছিল এবং অযৌক্তিকভাবে সিঙ্ক্রোনাইজেশনের ব্যয় প্রদান করছিল।
যেহেতু StringBuilderএকটি হল ড্রপ-ইন প্রতিস্থাপন জন্যStringBuffer সিঙ্ক্রোনাইজেশন ছাড়া, কোনো উদাহরণ মধ্যে পার্থক্য হবে না।
আপনি যদি করছে থ্রেড মধ্যে ভাগ করার চেষ্টা করছেন, আপনি ব্যবহার করতে পারেন StringBuffer, কিন্তু বিবেচনা কিনা উচ্চ স্তরের সিঙ্ক্রোনাইজেশন প্রয়োজনীয়, যেমন সম্ভবত StringBuffer ব্যবহারের পরিবর্তে, আপনি পদ্ধতি StringBuilder ব্যবহার সুসংগত করা উচিত নয়।
প্রথমে সাদৃশ্যগুলি দেখতে দিন : স্ট্রিংবিল্ডার এবং স্ট্রিংবুফার উভয়ই পারস্পরিক পরিবর্তনযোগ্য। এর অর্থ আপনি একই স্থানের সাথে তাদের বিষয়বস্তু পরিবর্তন করতে পারেন।
পার্থক্য : স্ট্রিংবফারটিও পারস্পরিক পরিবর্তনযোগ্য এবং সিঙ্ক্রোনাইজ করা। স্ট্রিংবিল্ডার হিসাবে যেখানে পরিবর্তনযোগ্য তবে ডিফল্টরূপে সিঙ্ক্রোনাইজ করা হয়নি।
সিঙ্ক্রোনাইজড (সিঙ্ক্রোনাইজেশন) এর অর্থ : যখন কোনও জিনিস সিঙ্ক্রোনাইজ করা হয়, তখন একাধিক থ্রেড অ্যাক্সেস করতে পারে এবং কোনও সমস্যা বা পার্শ্ব প্রতিক্রিয়া নিয়ে এটিকে পরিবর্তন করতে পারে। স্ট্রিংবফার সিঙ্ক্রোনাইজ করা হয়েছে, তাই আপনি কোনও সমস্যা ছাড়াই একাধিক থ্রেড সহ এটি ব্যবহার করতে পারেন।
কোনটি কখন ব্যবহার করবেন? স্ট্রিংবিল্ডার: আপনার যখন স্ট্রিং দরকার হয়, যা সংশোধনযোগ্য হতে পারে এবং কেবলমাত্র একটি থ্রেড এটি অ্যাক্সেস এবং সংশোধন করে। স্ট্রিংবফার: আপনার যখন স্ট্রিং দরকার হয়, যা সংশোধনযোগ্য হতে পারে এবং একাধিক থ্রেড এতে অ্যাক্সেস এবং সংশোধন করে।
দ্রষ্টব্য : স্ট্রিংবাফারকে অযথা ব্যবহার করবেন না, অর্থাত্ যদি কেবল একটি থ্রেড এটির সংশোধন ও অ্যাক্সেস করে থাকে তবে এটি ব্যবহার করবেন না কারণ এতে সিঙ্ক্রোনাইজেশনের জন্য প্রচুর লকিং এবং আনলকিং কোড রয়েছে যা অকারণে সিপিইউ সময় গ্রহণ করবে। এটি প্রয়োজন না হলে লক ব্যবহার করবেন না।
একক থ্রেডে, স্ট্রিংবুফার স্ট্রিংবিল্ডারের চেয়ে উল্লেখযোগ্যভাবে ধীর নয় , জেভিএম অপটিমাইজেশনের জন্য ধন্যবাদ। এবং মাল্টিথ্রেডিংয়ে আপনি কোনও স্ট্রিংবিল্ডার নিরাপদে ব্যবহার করতে পারবেন না।
এখানে আমার পরীক্ষা (কোনও মানদণ্ড নয়, কেবল একটি পরীক্ষা):
public static void main(String[] args) {
String withString ="";
long t0 = System.currentTimeMillis();
for (int i = 0 ; i < 100000; i++){
withString+="some string";
}
System.out.println("strings:" + (System.currentTimeMillis() - t0));
t0 = System.currentTimeMillis();
StringBuffer buf = new StringBuffer();
for (int i = 0 ; i < 100000; i++){
buf.append("some string");
}
System.out.println("Buffers : "+(System.currentTimeMillis() - t0));
t0 = System.currentTimeMillis();
StringBuilder building = new StringBuilder();
for (int i = 0 ; i < 100000; i++){
building.append("some string");
}
System.out.println("Builder : "+(System.currentTimeMillis() - t0));
}
ফলাফল:
স্ট্রিং: 319740
বাফার: 23
নির্মাতা: 7!
সুতরাং বিল্ডাররা বাফারদের চেয়ে দ্রুত এবং স্ট্রিং কনকনটেটিংয়ের চেয়ে WAY দ্রুত। এখন একাধিক থ্রেডের জন্য একটি নির্বাহক ব্যবহার করা যাক :
public class StringsPerf {
public static void main(String[] args) {
ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
//With Buffer
StringBuffer buffer = new StringBuffer();
for (int i = 0 ; i < 10; i++){
executorService.execute(new AppendableRunnable(buffer));
}
shutdownAndAwaitTermination(executorService);
System.out.println(" Thread Buffer : "+ AppendableRunnable.time);
//With Builder
AppendableRunnable.time = 0;
executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
StringBuilder builder = new StringBuilder();
for (int i = 0 ; i < 10; i++){
executorService.execute(new AppendableRunnable(builder));
}
shutdownAndAwaitTermination(executorService);
System.out.println(" Thread Builder: "+ AppendableRunnable.time);
}
static void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // code reduced from Official Javadoc for Executors
try {
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow();
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (Exception e) {}
}
}
class AppendableRunnable<T extends Appendable> implements Runnable {
static long time = 0;
T appendable;
public AppendableRunnable(T appendable){
this.appendable = appendable;
}
@Override
public void run(){
long t0 = System.currentTimeMillis();
for (int j = 0 ; j < 10000 ; j++){
try {
appendable.append("some string");
} catch (IOException e) {}
}
time+=(System.currentTimeMillis() - t0);
}
}
এখন স্ট্রিংবাফাররা 100000 অ্যাপেন্ডসের জন্য 157 এমএস নেয় । এটি একই পরীক্ষা নয়, তবে পূর্ববর্তী ৩ ms এমএসের তুলনায় আপনি নিরাপদে ধরে নিতে পারেন যে স্ট্রিংবফার সংযোজনগুলি মাল্টিথ্রেডিং ব্যবহারের সাথে ধীর । কারণটি হ'ল জেআইটি / হটস্পট / সংকলক / কোনও কিছু যখন অপ্টিমাইজেশন করে তখন সনাক্ত করে যে লকগুলি পরীক্ষা করার দরকার নেই ।
তবে স্ট্রিংবিল্ডারের সাহায্যে আপনার জাভা.এল.আংআরএন্ডএক্সেক্স আউটফাউন্ডস এক্সসেপশন রয়েছে, কারণ একত্রী থ্রেড এমন কিছু যুক্ত করার চেষ্টা করে যেখানে এটি করা উচিত নয়।
উপসংহারটি হ'ল আপনাকে স্ট্রিংবাফারদের তাড়াতে হবে না। এবং যেখানে আপনার থ্রেড রয়েছে, কয়েকটি ন্যানোসেকেন্ড অর্জন করার চেষ্টা করার আগে তারা কী করছে তা ভেবে দেখুন।
withString+="some string"+i+" ; ";অন্য দুটি লুপের সমতুল্য নয় এবং অতএব এটি একটি উপযুক্ত তুলনা নয়।
স্ট্রিংবিল্ডার জাভা 1.5 তে প্রবর্তিত হয়েছিল তাই এটি আগের জেভিএমগুলির সাথে কাজ করবে না।
জাভাদোকস থেকে :
স্ট্রিংবুডার শ্রেণি স্ট্রিংবফারের সাথে সামঞ্জস্যপূর্ণ একটি এপিআই সরবরাহ করে তবে সিঙ্ক্রোনাইজেশনের কোনও গ্যারান্টি ছাড়াই। এই শ্রেণিটি স্ট্রিংবাফারের জন্য ড্রপ-ইন প্রতিস্থাপন হিসাবে যে জায়গাগুলিতে স্ট্রিং বাফারটি একক থ্রেড দ্বারা ব্যবহৃত হচ্ছিল (যেমনটি সাধারণভাবে হয় তেমন) use যেখানে সম্ভব, এটি সুপারিশ করা হয় যে এই শ্রেণিটি স্ট্রিংবাফারকে অগ্রাধিকার হিসাবে ব্যবহার করা উচিত কারণ এটি বেশিরভাগ বাস্তবায়নের অধীনে দ্রুততর হবে।
StringBuilder।
খুব ভাল প্রশ্ন
এখানে পার্থক্যগুলি আমি লক্ষ্য করেছি:
স্ট্রিংবাফার: -
StringBuffer is synchronized
StringBuffer is thread-safe
StringBuffer is slow (try to write a sample program and execute it, it will take more time than StringBuilder)
StringBuilder: -
StringBuilder is not synchronized
StringBuilder is not thread-safe
StringBuilder performance is better than StringBuffer.
সাধারণ জিনিস: -
উভয়ের একই স্বাক্ষর সহ একই পদ্ধতি রয়েছে। উভয়ই পরিবর্তনযোগ্য।
StringBuffer
StringBuilder
StringBufferঅন্য কোনও পরিবর্তন ছাড়াই আপনি এটি প্রতিস্থাপন করতে পারেনappendদুইবার, অথবা appendএবং toStringনা নিরাপদ নয়।
StringBuilderএবং StringBufferপ্রায় একই। পার্থক্যটি হ'ল StringBufferসিঙ্ক্রোনাইজ করা এবং StringBuilderতা নয়। যদিও এর StringBuilderচেয়ে দ্রুত StringBuffer, পারফরম্যান্সের পার্থক্য খুব কম। StringBuilderএকটি সান এর প্রতিস্থাপনStringBuffer । এটি কেবল সমস্ত পাবলিক পদ্ধতি থেকে সিঙ্ক্রোনাইজেশন এড়িয়ে চলে। পরিবর্তে, তাদের কার্যকারিতা একই।
ভাল ব্যবহারের উদাহরণ:
যদি আপনার পাঠ্যটি পরিবর্তন হতে চলেছে এবং একাধিক থ্রেড দ্বারা ব্যবহৃত হয়, তবে এটি ব্যবহার করা ভাল StringBuffer। যদি আপনার পাঠ্যটি পরিবর্তন হতে চলেছে তবে একক থ্রেড দ্বারা ব্যবহৃত হয়, তবে ব্যবহার করুন StringBuilder।
StringBuffer
স্ট্রিংবাফার হ'ল পরিবর্তনযোগ্য অর্থ একটি বস্তুর মান পরিবর্তন করতে পারে। স্ট্রিংবুফারের মাধ্যমে তৈরি করা বস্তুটি হিপগুলিতে সঞ্চয় করা হয়। স্ট্রিংবুফারের স্ট্রিংবুডার হিসাবে একই পদ্ধতি রয়েছে তবে স্ট্রিংবুফারের প্রতিটি পদ্ধতি সিঙ্ক্রোনাইজ করা হয় যে স্ট্রিংবফার থ্রেড নিরাপদ।
এ কারণে এটি দুটি থ্রেড একই সাথে একই পদ্ধতিতে অ্যাক্সেস করতে দেয় না। প্রতিটি পদ্ধতি একবারে একটি থ্রেড দ্বারা অ্যাক্সেস করা যেতে পারে।
তবে থ্রেড নিরাপদ হওয়ার অসুবিধাও রয়েছে কারণ থ্রেড নিরাপদ সম্পত্তির কারণে স্ট্রিংবাফারের অভিনয় হিট performance সুতরাং প্রতিটি শ্রেণীর একই পদ্ধতিতে কল করার সময় স্ট্রিংবুডার স্ট্রিংবুফারের চেয়ে দ্রুততর হয়।
স্ট্রিংবাফার মান পরিবর্তন করা যেতে পারে, এর অর্থ এটি নতুন মানের বরাদ্দ করা যেতে পারে। আজকাল এটি একটি খুব সাধারণ সাক্ষাত্কারের প্রশ্ন, উপরের শ্রেণীর মধ্যে পার্থক্য। স্ট্রিং বাফারকে স্ট্রিং () পদ্ধতি ব্যবহার করে স্ট্রিংয়ে রূপান্তর করা যায়।
StringBuffer demo1 = new StringBuffer(“Hello”) ;
// The above object stored in heap and its value can be changed .
demo1=new StringBuffer(“Bye”);
// Above statement is right as it modifies the value which is allowed in the StringBuffer
StringBuilder
স্ট্রিংবিল্ডার স্ট্রিংবুফারের সমান, এটি হ'ল এটি বস্তুটিকে গাদা করে রাখে এবং এটি পরিবর্তনও করা যায়। স্ট্রিংবুফার এবং স্ট্রিংবিল্ডারের মধ্যে প্রধান পার্থক্য হ'ল স্ট্রিংবুডারও থ্রেড নিরাপদ নয়। স্ট্রিংবিল্ডার দ্রুততর কারণ এটি থ্রেড নিরাপদ নয়।
StringBuilder demo2= new StringBuilder(“Hello”);
// The above object too is stored in the heap and its value can be modified
demo2=new StringBuilder(“Bye”);
// Above statement is right as it modifies the value which is allowed in the StringBuilder
String অপরিবর্তনীয়
StringBuffer একটি পরিবর্তনীয় এবং সিঙ্ক্রোনাইজড।
StringBuilder এছাড়াও পরিবর্তনীয় তবে এটি সিঙ্ক্রোনাইজড নয়।
Javadoc পার্থক্য ব্যাখ্যা করে:
এই শ্রেণিটি স্ট্রিংবুফারের সাথে সামঞ্জস্যপূর্ণ একটি এপিআই সরবরাহ করে তবে সিঙ্ক্রোনাইজেশনের কোনও গ্যারান্টি ছাড়াই। এই শ্রেণিটি স্ট্রিংবাফারের জন্য ড্রপ-ইন প্রতিস্থাপন হিসাবে যে জায়গাগুলিতে স্ট্রিং বাফারটি একক থ্রেড দ্বারা ব্যবহৃত হচ্ছিল (যেমনটি সাধারণভাবে হয় তেমন) use যেখানে সম্ভব, এটি সুপারিশ করা হয় যে এই শ্রেণিটি স্ট্রিংবাফারকে অগ্রাধিকার হিসাবে ব্যবহার করা উচিত কারণ এটি বেশিরভাগ বাস্তবায়নের অধীনে দ্রুততর হবে।
StringBuilder (জাভা 5 তে প্রবর্তিত) এর অনুরূপ StringBuffer এর পদ্ধতিগুলি সিঙ্ক্রোনাইজ করা ব্যতীত । এর অর্থ এটির পরবর্তীগুলির চেয়ে ভাল পারফরম্যান্স রয়েছে তবে ত্রুটিটি এটি থ্রেড-নিরাপদ নয়।
আরও বিশদ জন্য টিউটোরিয়াল পড়ুন ।
স্ট্রিংবুফার এবং স্ট্রিংবিল্ডারের মধ্যে পার্থক্য বোঝানোর জন্য একটি সাধারণ প্রোগ্রাম:
/**
* Run this program a couple of times. We see that the StringBuilder does not
* give us reliable results because its methods are not thread-safe as compared
* to StringBuffer.
*
* For example, the single append in StringBuffer is thread-safe, i.e.
* only one thread can call append() at any time and would finish writing
* back to memory one at a time. In contrast, the append() in the StringBuilder
* class can be called concurrently by many threads, so the final size of the
* StringBuilder is sometimes less than expected.
*
*/
public class StringBufferVSStringBuilder {
public static void main(String[] args) throws InterruptedException {
int n = 10;
//*************************String Builder Test*******************************//
StringBuilder sb = new StringBuilder();
StringBuilderTest[] builderThreads = new StringBuilderTest[n];
for (int i = 0; i < n; i++) {
builderThreads[i] = new StringBuilderTest(sb);
}
for (int i = 0; i < n; i++) {
builderThreads[i].start();
}
for (int i = 0; i < n; i++) {
builderThreads[i].join();
}
System.out.println("StringBuilderTest: Expected result is 1000; got " + sb.length());
//*************************String Buffer Test*******************************//
StringBuffer sb2 = new StringBuffer();
StringBufferTest[] bufferThreads = new StringBufferTest[n];
for (int i = 0; i < n; i++) {
bufferThreads[i] = new StringBufferTest(sb2);
}
for (int i = 0; i < n; i++) {
bufferThreads[i].start();
}
for (int i = 0; i < n; i++) {
bufferThreads[i].join();
}
System.out.println("StringBufferTest: Expected result is 1000; got " + sb2.length());
}
}
// Every run would attempt to append 100 "A"s to the StringBuilder.
class StringBuilderTest extends Thread {
StringBuilder sb;
public StringBuilderTest (StringBuilder sb) {
this.sb = sb;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
sb.append("A");
}
}
}
//Every run would attempt to append 100 "A"s to the StringBuffer.
class StringBufferTest extends Thread {
StringBuffer sb2;
public StringBufferTest (StringBuffer sb2) {
this.sb2 = sb2;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
sb2.append("A");
}
}
}
স্ট্রিংবুফার অক্ষর স্ট্রিংগুলি সংরক্ষণ করার জন্য ব্যবহৃত হয় যা পরিবর্তিত হবে (স্ট্রিং অবজেক্টগুলি পরিবর্তন করা যায় না)। এটি স্বয়ংক্রিয়ভাবে প্রয়োজন হিসাবে প্রসারিত হয়। সম্পর্কিত ক্লাস: স্ট্রিং, চারসেকেন্স।
স্ট্রিংবিল্ডারটি জাভা ৫-এ যুক্ত করা হয়েছিল স্ট্রিংবুফারের সাথে এটি সমস্ত ক্ষেত্রে সমান, এটি ব্যতীত এটি সিঙ্ক্রোনাইজ করা হয়নি, যার অর্থ যদি একসাথে একাধিক থ্রেড এটি অ্যাক্সেস করে থাকে তবে সমস্যা হতে পারে। একক থ্রেডেড প্রোগ্রামগুলির জন্য, সিংক্রোনাইজেশনের ওভারহেড এড়ানো সর্বাধিক সাধারণ ক্ষেত্রে স্ট্রিংবিল্ডারটিকে কিছুটা দ্রুততর করা হয়।
StringBuilders সাধারণত কোনও পদ্ধতির কাছে স্থানীয় হয়, যেখানে সেগুলি কেবল একটি থ্রেডে দৃশ্যমান।
StringBufferসিঙ্ক্রোনাইজ করা হয়, কিন্তু StringBuilderহয় না। ফলস্বরূপ, StringBuilderতুলনায় দ্রুত StringBuffer।
স্ট্রিংবাফার পরিবর্তনযোগ্য। এটি দৈর্ঘ্য এবং সামগ্রীর দিক থেকে পরিবর্তন করতে পারে। স্ট্রিংবাফারগুলি থ্রেড-নিরাপদ, যার অর্থ অ্যাক্সেস নিয়ন্ত্রণের জন্য তাদের সিঙ্ক্রোনাইজড পদ্ধতি রয়েছে যাতে একবারে কেবল একটি থ্রেড স্ট্রিংবফার অবজেক্টের সিঙ্ক্রোনাইজ কোডটি অ্যাক্সেস করতে পারে। সুতরাং, স্ট্রিংবাফার অবজেক্টগুলি সাধারণত একাধিক থ্রেডযুক্ত পরিবেশে ব্যবহার করা নিরাপদ যেখানে একাধিক থ্রেড একই সাথে একই স্ট্রিংবফার অবজেক্টটিতে অ্যাক্সেস করার চেষ্টা করতে পারে।
স্ট্রিংবিল্ডার স্ট্রিংবিল্ডার ক্লাসটি স্ট্রিংবুফারের সাথে খুব সমান, এর অ্যাক্সেসটি সিঙ্ক্রোনাইজ করা হয় না যাতে এটি থ্রেড-নিরাপদ নয়। সিঙ্ক্রোনাইজ না হয়ে স্ট্রিংবুডারের পারফরম্যান্স স্ট্রিংবুফারের চেয়ে ভাল হতে পারে। সুতরাং, আপনি যদি একক থ্রেডযুক্ত পরিবেশে কাজ করছেন, স্ট্রিংবুফারের পরিবর্তে স্ট্রিংবিল্ডার ব্যবহারের ফলে কর্মক্ষমতা বাড়তে পারে। এটি অন্যান্য পরিস্থিতিতে যেমন সত্য একটি স্ট্রিংবিল্ডার স্থানীয় ভেরিয়েবল (যেমন একটি পদ্ধতির মধ্যে একটি ভেরিয়েবল) যেখানে কেবল একটি থ্রেড স্ট্রিংবিল্ডার অবজেক্টে অ্যাক্সেস করবে।
StringBuffer:
StringBuilder
String c = a + bসমান String c = new StringBuilder().append(a).append(b).toString(), তাই এটি দ্রুত হয় না। এটা শুধুমাত্র যে, তোমরা একে স্ট্রিং স্থিরীকরণ জন্য একটি নতুন তৈরি, আপনি যদি শুধুমাত্র একটি হতে পারে যখন এর ( String d = a + b; d = d + c;হয় String d = new StringBuilder().append(a).append(b).toString(); d = new StringBuilder().append(d).append(c).toString();যখন StringBuilder sb = new StringBuilder(); sb.append(a).append(b); sb.append(c); String d = sb.toString();এক StringBuilder instanciation রক্ষা হবে)।
স্ট্রিং-নির্মাতা :
int one = 1;
String color = "red";
StringBuilder sb = new StringBuilder();
sb.append("One=").append(one).append(", Color=").append(color).append('\n');
System.out.print(sb);
// Prints "One=1, Colour=red" followed by an ASCII newline.
স্ট্রিং-বাফার
StringBuffer sBuffer = new StringBuffer("test");
sBuffer.append(" String Buffer");
System.out.println(sBuffer);
এটি যখনই সম্ভব স্ট্রিংবুডার ব্যবহার করার পরামর্শ দেওয়া হচ্ছে কারণ এটি স্ট্রিংবুফারের চেয়ে দ্রুত। তবে, থ্রেড সুরক্ষা যদি প্রয়োজনীয় হয় তবে সর্বোত্তম বিকল্প হ'ল স্ট্রিংবাফার অবজেক্টস।
StringBuilderএটি সিঙ্ক্রোনাইজ করা না হওয়ায় আরও ভাল ব্যবহার এবং অতএব আরও ভাল পারফরম্যান্স সরবরাহ করে। পুরানো StringBuilderএকটি ড্রপ-ইন প্রতিস্থাপনStringBuffer ।
StringBu(ff|ild)erস্থানীয় একক পরিবর্তনশীল যা কেবল একটি একক থ্রেড দ্বারা ব্যবহৃত হয়।
যেহেতু StringBufferসিঙ্ক্রোনাইজ করা হয়েছে, এর জন্য কিছু অতিরিক্ত প্রচেষ্টা দরকার, তাই পারফরম্যান্সের উপর ভিত্তি করে, এর চেয়ে কিছুটা ধীর StringBuilder।
কোন মৌলিক পার্থক্য মধ্যে হয় StringBuilderএবং StringBuffer, মাত্র কয়েক পার্থক্য তাদের মধ্যে বিদ্যমান। ইন StringBufferপদ্ধতি সুসংগত করা হয়। এর অর্থ হল যে এক সময়ে কেবল একটি থ্রেড তাদের উপর পরিচালনা করতে পারে। যদি একাধিক থ্রেড থাকে তবে দ্বিতীয় থ্রেডটি প্রথমটির সমাপ্তির জন্য অপেক্ষা করতে হবে এবং তৃতীয়টি প্রথম এবং দ্বিতীয়টি শেষ হওয়ার জন্য অপেক্ষা করতে হবে এবং এই জাতীয় আরও অনেক কিছু। এটি প্রক্রিয়াটি খুব ধীর করে তোলে এবং তাই এর ক্ষেত্রে কর্মক্ষমতাStringBuffer কম।
অন্যদিকে, StringBuilderসিঙ্ক্রোনাইজ করা হয় না। এর অর্থ হ'ল StringBuilderএকই সময়ে একই সাথে একাধিক থ্রেড পরিচালনা করতে পারে । এটি প্রক্রিয়াটি খুব দ্রুত করে তোলে এবং তাই এর কার্যকারিতা বেশি StringBuilder।
এ Stringহ'ল একটি অপরিবর্তনীয় বস্তু যার অর্থ মানটি আর পরিবর্তন করা যায় নাStringBuffer পরিবর্তনীয়।
StringBufferঅত: পর সিঙ্ক্রোনাইজ করা আছে থ্রেড-নিরাপদ যেহেতু StringBuilderশুধুমাত্র একক থ্রেডেড দৃষ্টান্ত না এবং উপযুক্ত।
প্রধান পার্থক্যটি সিঙ্ক্রোনাইজড StringBufferতবে StringBuilderতা নয় you আপনার যদি একাধিক থ্রেড ব্যবহার করার প্রয়োজন হয় তবে স্ট্রিংবুফারের প্রস্তাব দেওয়া হয় B তবে সম্পাদনের গতি অনুযায়ী StringBuilderদ্রুততর হয় StringBuffer, কারণ এটি সিঙ্ক্রোনাইজড নয়।
এর সিঙ্ক্রোনাইজড অ্যাপেন্ড পদ্ধতির ইন্টারনালগুলি StringBufferএবং নন-সিঙ্ক্রোনাইজড অ্যাপেন্ড পদ্ধতির পরীক্ষা করুন StringBuilder।
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
}
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
যেহেতু অ্যাপেন্ড হয় synchronized, মাল্টি-থ্রেডিং দৃশ্যের StringBufferতুলনায় পারফরম্যান্সের ওভারহেড রয়েছে StrinbBuilder। যতক্ষণ না আপনি একাধিক থ্রেডের মধ্যে বাফার ভাগ করছেন না, ব্যবহার করুন StringBuilder, যা synchronizedসংযোজন পদ্ধতিতে না থাকার কারণে দ্রুত ।
স্ট্রিং বনাম স্ট্রিংবফার বনাম স্ট্রিংবুডার এর পারফরম্যান্স পরীক্ষার ফলাফল এখানে । অবশেষে, স্ট্রিংবিল্ডার টেস্টটি জিতেছিলেন। পরীক্ষার কোড এবং ফলাফলের জন্য নীচে দেখুন।
কোড :
private static void performanceTestStringVsStringbuffereVsStringBuilder() {
// String vs StringBiffer vs StringBuilder performance Test
int loop = 100000;
long start = 0;
// String
String str = null;
start = System.currentTimeMillis();
for (int i = 1; i <= loop; i++) {
str += i + "test";
}
System.out.println("String - " + (System.currentTimeMillis() - start) + " ms");
// String buffer
StringBuffer sbuffer = new StringBuffer();
start = System.currentTimeMillis();
for (int i = 1; i <= loop; i++) {
sbuffer.append(i).append("test");
}
System.out.println("String Buffer - " + (System.currentTimeMillis() - start) + " ms");
// String builder
start = System.currentTimeMillis();
StringBuilder sbuilder = new StringBuilder();
for (int i = 1; i <= loop; i++) {
sbuffer.append(i).append("test");
}
System.out.println("String Builder - " + (System.currentTimeMillis() - start) + " ms");
}
ফলাফল :
একক পাঠ্য যোগ করার জন্য 100000 পুনরাবৃত্তি
String - 37489 ms
String Buffer - 5 ms
String Builder - 4 ms
একটি একক পাঠ্য যোগ করার জন্য 10000 পুনরাবৃত্তি
String - 389 ms
String Buffer - 1 ms
String Builder - 1 ms