স্ট্রিংবুডার এবং স্ট্রিংবুফারের মধ্যে পার্থক্য


1577

মধ্যে মূল পার্থক্য কি StringBufferএবং StringBuilder? এর যে কোনও একটিতে সিদ্ধান্ত নেওয়ার সময় কোনও পারফরম্যান্স সমস্যা আছে?

উত্তর:


1665

StringBufferসিঙ্ক্রোনাইজ করা হয়, StringBuilderহয় না।


239
এবং স্ট্রিংবুডারকে স্ট্রিংবুফারের প্রতিস্থাপনের ড্রপ হিসাবে লক্ষ্য করা যায় যেখানে সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না
জোয়েল

95
এবং সিঙ্ক্রোনাইজেশন কার্যত কখনই প্রয়োজন হয় না। যদি কেউ স্ট্রিংবিল্ডারে সিঙ্ক্রোনাইজ করতে চায় তবে তারা উদাহরণের সাথে সিঙ্ক্রোনাইজড (এসবি) with with দিয়ে কোডের পুরো ব্লকটি ঘিরে ফেলতে পারে
লক্কা

23
@ লোলকা আমি যুক্তি দিয়ে বলব যে স্ট্রিংবাফার কখনই একটি ভাল ধারণা নয় (যদি আপনার কোনও API প্রয়োজন হয় না তবে) ভ্যানিলাজভা.ব্লগস্পট.ডি
পিটার

8
আমি কেবল স্ট্রিংবাফারের জন্য দেখতে পেলাম আউটপুট এবং বিভিন্ন লগিং ইউটিলিটির মতো কনসোল many যেহেতু আপনি 2 আউটপুটটি মিশ্রণ পেতে চান না ... তবে স্ট্রিংবাফার স্তরে সাধারণত সিঙ্ক্রোনাইজ করা খুব কম স্তর, আপনি লেভেলমের মতো একটি অ্যাপেন্ডারে সিঙ্ক্রোনাইজ করতে চাইবেন তাই লক্কার উত্তরটি সেরা এবং স্ট্রিংবাফারকে অবমূল্যায়ন করা উচিত। এটি newbies সঙ্গে কোড পর্যালোচনা সময় বাঁচাতে হবে।
রেমি মরিন

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

728

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


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

7
আপনি আগে গরম করা প্রয়োজন। এই পরীক্ষাটি স্ট্রিংবুফারের পক্ষে অন্যায্য। এছাড়াও, এটি ভাল কিছু হবে যদি এটি আসলে কিছু সংযোজন করে। আসলে, আমি পরীক্ষাটি উল্টিয়ে দিয়েছি এবং এলোমেলো স্ট্রিং যুক্ত করেছি এবং বিপরীত পরীক্ষা পেয়েছি। বলতে গেলে যে কেউ সাধারণ বেনমার্কগুলিতে বিশ্বাস করতে পারে না। বিপরীত দেখায় স্ট্রিংবাফার দ্রুততর। 5164 StringBuilder বনাম 3699 StringBuffer জন্য hastebin.com/piwicifami.avrasm
MMM

75
এই প্রথম আমি --> 0লুপ দেখতে । এর অর্থ কী তা বোঝার জন্য আমাকে এক মুহূর্ত নিল। এটি কি এমন কিছু যা বাস্তবে স্বাভাবিক ...; i > 0; i--সিনট্যাক্সের পরিবর্তে ব্যবহার করা হয় ?
রায়মুন্ড ক্রিমার

19
যে i -->সত্যিই বিরক্তিকর সিনট্যাক্স প্রজ্ঞাময় ... আমি ভেবেছিলাম এটা হওয়া ASCII শিল্প সম্পর্কে মন্তব্য কারণে প্রথমে একটি তীর ছিল।
সমীর পুরি

14
অন্যরা বিভিন্ন ফলাফলের সাথে সমাপ্ত হয়: alblue.bandlem.com/2016/04/jmh-stringbuffer-stringbuilder.html । বেঞ্চমার্কগুলি সত্যিকার অর্থে জেএমএইচ দিয়ে করা উচিত, সাধারণের সাথে নয় your আপনার মানদণ্ডটি main()অন্যায্য। কোন উষ্ণতা নেই।
লুকাস এদার

249

মূলত, StringBufferপদ্ধতিগুলি যখন সিঙ্ক্রোনাইজ হয় তখনStringBuilder না থাকে হয়।

অপারেশনগুলি "প্রায়" একই, তবে একক থ্রেডে সিঙ্ক্রোনাইজড পদ্ধতি ব্যবহার করা ওভারকিল।

এটি সম্পর্কে বেশ।

স্ট্রিংবিল্ডার এপিআইয়ের উদ্ধৃতি :

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

সুতরাং এটি এর বিকল্প তৈরি করা হয়েছিল।

একই ঘটনা ঘটেছে Vectorএবং এর সাথেও ArrayList


1
সাথে Hashtableএবং HashMap
shmosel

176

কিন্তু একটি উদাহরণের সাহায্যে স্পষ্ট পার্থক্য পাওয়া দরকার?

স্ট্রিংবুফার বা স্ট্রিংবিল্ডার

StringBuilderআপনি যদি থ্রেডগুলির মধ্যে বাফারটি ভাগ করে নেওয়ার চেষ্টা না করেন তবে সহজেই ব্যবহার করুন । StringBuilderআসল সিঙ্ক্রোনাইজ করা StringBufferশ্রেণীর ছোট ভাই হ'ল অবিচ্ছিন্ন (কম ওভারহেড = আরও দক্ষ) ।

StringBufferপ্রথম এসেছিল। সূর্য সমস্ত অবস্থার অধীনে নির্ভুলতার সাথে উদ্বিগ্ন ছিল, তাই তারা কেবল এটি ক্ষেত্রে থ্রেড-নিরাপদ করে তুলতে এটি সিঙ্ক্রোনাইজ করেছিল।

StringBuilderপরে এসেছিল। এর বেশিরভাগ ব্যবহারStringBuffer একক থ্রেড ছিল এবং অযৌক্তিকভাবে সিঙ্ক্রোনাইজেশনের ব্যয় প্রদান করছিল।

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

আপনি যদি করছে থ্রেড মধ্যে ভাগ করার চেষ্টা করছেন, আপনি ব্যবহার করতে পারেন StringBuffer, কিন্তু বিবেচনা কিনা উচ্চ স্তরের সিঙ্ক্রোনাইজেশন প্রয়োজনীয়, যেমন সম্ভবত StringBuffer ব্যবহারের পরিবর্তে, আপনি পদ্ধতি StringBuilder ব্যবহার সুসংগত করা উচিত নয়।


14
প্রথম ভাল উত্তর !! বিষয়টি হ'ল "যদি আপনি থ্রেডগুলির মধ্যে একটি বাফার ভাগ না করেন"
অ্যালেক্সওয়েন

1
খুব বিস্তারিত উত্তর!
রাউল

81

প্রথমে সাদৃশ্যগুলি দেখতে দিন : স্ট্রিংবিল্ডার এবং স্ট্রিংবুফার উভয়ই পারস্পরিক পরিবর্তনযোগ্য। এর অর্থ আপনি একই স্থানের সাথে তাদের বিষয়বস্তু পরিবর্তন করতে পারেন।

পার্থক্য : স্ট্রিংবফারটিও পারস্পরিক পরিবর্তনযোগ্য এবং সিঙ্ক্রোনাইজ করা। স্ট্রিংবিল্ডার হিসাবে যেখানে পরিবর্তনযোগ্য তবে ডিফল্টরূপে সিঙ্ক্রোনাইজ করা হয়নি।

সিঙ্ক্রোনাইজড (সিঙ্ক্রোনাইজেশন) এর অর্থ : যখন কোনও জিনিস সিঙ্ক্রোনাইজ করা হয়, তখন একাধিক থ্রেড অ্যাক্সেস করতে পারে এবং কোনও সমস্যা বা পার্শ্ব প্রতিক্রিয়া নিয়ে এটিকে পরিবর্তন করতে পারে। স্ট্রিংবফার সিঙ্ক্রোনাইজ করা হয়েছে, তাই আপনি কোনও সমস্যা ছাড়াই একাধিক থ্রেড সহ এটি ব্যবহার করতে পারেন।

কোনটি কখন ব্যবহার করবেন? স্ট্রিংবিল্ডার: আপনার যখন স্ট্রিং দরকার হয়, যা সংশোধনযোগ্য হতে পারে এবং কেবলমাত্র একটি থ্রেড এটি অ্যাক্সেস এবং সংশোধন করে। স্ট্রিংবফার: আপনার যখন স্ট্রিং দরকার হয়, যা সংশোধনযোগ্য হতে পারে এবং একাধিক থ্রেড এতে অ্যাক্সেস এবং সংশোধন করে।

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


2
কেবল উল্লেখ করতে চাই যে স্ট্রিংবফারের আইডিআইভিডুয়াল পদ্ধতি কলগুলি থ্রেড-নিরাপদ। তবে আপনার যদি কোডের একাধিক লাইন থাকে তবে থ্রেড-সুরক্ষার গ্যারান্টি দিতে একটি সিঙ্ক্রোনাইজড কোড ব্লক ব্যবহার করুন, কিছু লক / মনিটরের (যথারীতি ...) সহ মূলত, কেবল ধরে নিবেন না যে একটি থ্রেড-নিরাপদ লাইব্রেরি ব্যবহার করার সাথে সাথেই আপনার প্রোগ্রামে থ্রেড-সুরক্ষার গ্যারান্টি রয়েছে!
কেভিন লি

57

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

এখানে আমার পরীক্ষা (কোনও মানদণ্ড নয়, কেবল একটি পরীক্ষা):

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 এমএসের তুলনায় আপনি নিরাপদে ধরে নিতে পারেন যে স্ট্রিংবফার সংযোজনগুলি মাল্টিথ্রেডিং ব্যবহারের সাথে ধীর । কারণটি হ'ল জেআইটি / হটস্পট / সংকলক / কোনও কিছু যখন অপ্টিমাইজেশন করে তখন সনাক্ত করে যে লকগুলি পরীক্ষা করার দরকার নেই

তবে স্ট্রিংবিল্ডারের সাহায্যে আপনার জাভা.এল.আংআরএন্ডএক্সেক্স আউটফাউন্ডস এক্সসেপশন রয়েছে, কারণ একত্রী থ্রেড এমন কিছু যুক্ত করার চেষ্টা করে যেখানে এটি করা উচিত নয়।

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


5
আপনি "t0 = System.currentTimeMillis () করতে ভুলে গেছেন; স্ট্রিংবিল্ডার পরীক্ষা করার আগে। সুতরাং স্ট্রিংবিল্ডারের জন্য প্রদর্শিত চিত্রটি আসলে স্ট্রিংবুফার এবং স্ট্রিংবিল্ডার পরীক্ষা চালাতে সময় নেয়। এই লাইনটি জুড়ুন এবং আপনি দেখতে পাবেন যে স্ট্রিংবিল্ডার দুটি সময় সম্পর্কে দ্রুত।
জেনা বাটসায়ান

নোটটি withString+="some string"+i+" ; ";অন্য দুটি লুপের সমতুল্য নয় এবং অতএব এটি একটি উপযুক্ত তুলনা নয়।
ডেভ জার্ভিস

ঠিক, সংশোধন। চিন্তার স্ট্রিংগুলি এখনও খুব ধীর।
নিকোলাস জোজল

আপনি আরও ব্যাখ্যা করতে পারেন কেন স্ট্রিংবিল্ডারের পক্ষে অ্যারেআইন্ডেক্স আউট
আলিরিজা ফাত্তাহী

আপনার বেঞ্চমার্কের জন্য জেএমএইচ ব্যবহার করা উচিত। আপনার মানদণ্ডটি সত্যই ভুল।
লুকাস এদার

42

স্ট্রিংবিল্ডার জাভা 1.5 তে প্রবর্তিত হয়েছিল তাই এটি আগের জেভিএমগুলির সাথে কাজ করবে না।

জাভাদোকস থেকে :

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


13
1.4 এর পরিষেবা জীবনের শেষদিকে, তাই এটি 1.5-পূর্ব সম্পর্কে খুব চিন্তিত বলে মনে হয় না।
টম হাটিন -

@ টমহাউটিন-ট্যাকলাইন অগত্যা নয় - সেখানে ১.৪ প্রাক-এন্টারপ্রাইজ পণ্য রয়েছে যা আমাদের বেশিরভাগই প্রতিদিন ব্যবহার করে। এছাড়াও ব্ল্যাকবেরি জাভা 1.4 এর উপর ভিত্তি করে এবং এটি এখনও খুব বর্তমান।
রিচার্ড লে মেসুরিয়ার

এবং সিডিসি এবং সিএলডিসির নেই StringBuilder
জিন কোওন

37

খুব ভাল প্রশ্ন

এখানে পার্থক্যগুলি আমি লক্ষ্য করেছি:

স্ট্রিংবাফার: -

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.

সাধারণ জিনিস: -

উভয়ের একই স্বাক্ষর সহ একই পদ্ধতি রয়েছে। উভয়ই পরিবর্তনযোগ্য।


23

StringBuffer

  • তাই সিঙ্ক্রোনাইজড থ্রেডসেফ
  • থ্রেড নিরাপদ তাই ধীর

StringBuilder

  • জাভা 5.0 এ পরিচয় করিয়ে দেওয়া
  • অতএব অ্যাসিঙ্ক্রোনাস দ্রুত এবং দক্ষ
  • ব্যবহারকারীর স্পষ্টতই এটি সিঙ্ক্রোনাইজ করা দরকার, যদি তিনি চান
  • StringBufferঅন্য কোনও পরিবর্তন ছাড়াই আপনি এটি প্রতিস্থাপন করতে পারেন

দ্রষ্টব্য: কেবল একক ক্রিয়াকলাপগুলি থ্রেড-নিরাপদ, একাধিক ক্রিয়াকলাপ নয়। যেমন যদি আপনি কল appendদুইবার, অথবা appendএবং toStringনা নিরাপদ নয়।
পিটার লরে

22

স্ট্রিংবিল্ডার থ্রেড নিরাপদ নয়। স্ট্রিং বাফার হ'ল। আরও তথ্য এখানে

সম্পাদনা: পারফরম্যান্সের ক্ষেত্রে হটস্পট কিকের পরে স্ট্রিংবিল্ডার বিজয়ী। যাইহোক, ছোট পুনরাবৃত্তির জন্য, পারফরম্যান্স পার্থক্য নগণ্য।


21

StringBuilderএবং StringBufferপ্রায় একই। পার্থক্যটি হ'ল StringBufferসিঙ্ক্রোনাইজ করা এবং StringBuilderতা নয়। যদিও এর StringBuilderচেয়ে দ্রুত StringBuffer, পারফরম্যান্সের পার্থক্য খুব কম। StringBuilderএকটি সান এর প্রতিস্থাপনStringBuffer । এটি কেবল সমস্ত পাবলিক পদ্ধতি থেকে সিঙ্ক্রোনাইজেশন এড়িয়ে চলে। পরিবর্তে, তাদের কার্যকারিতা একই।

ভাল ব্যবহারের উদাহরণ:

যদি আপনার পাঠ্যটি পরিবর্তন হতে চলেছে এবং একাধিক থ্রেড দ্বারা ব্যবহৃত হয়, তবে এটি ব্যবহার করা ভাল StringBuffer। যদি আপনার পাঠ্যটি পরিবর্তন হতে চলেছে তবে একক থ্রেড দ্বারা ব্যবহৃত হয়, তবে ব্যবহার করুন StringBuilder


19

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

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

সংস্থান: স্ট্রিং বনাম স্ট্রিংবফার বনাম স্ট্রিংবিল্ডার


StringBuilder অপরিবর্তনীয় এবং স্ট্রিং টাইপ চপল হয়
বৃন্দা রাঠোর

আমি সম্মত হব না যে স্ট্রিংস এবং স্ট্রিংবুডাররা "দ্রুত" এবং স্ট্রিংবুফারগুলি "খুব ধীর"। উপরের উত্তর দেখুন।
ফায়ারকিউজ

17

String অপরিবর্তনীয়

StringBuffer একটি পরিবর্তনীয় এবং সিঙ্ক্রোনাইজড।

StringBuilder এছাড়াও পরিবর্তনীয় তবে এটি সিঙ্ক্রোনাইজড নয়।


অতিরিক্তভাবে স্ট্রিংবুফার এই থ্রেডটি নিরাপদ ডেটা অ্যাক্সেসের জন্য থ্রেডকে লক করে রাখে এজন্য অপারেশন ধীরে ধীরে চলে। স্ট্রিংবিল্ডার থ্রেডটিকে লক করে না এবং এটি মাল্টি থ্রেডিং পদ্ধতিতে চালিত হয় সে কারণেই দ্রুত। স্ট্রিং - যখন আপনার স্ট্রিংগুডেন্ট স্ট্রিংয়ের দরকার নেই এটি ভাল উপায়, তবে আপনার যখন স্ট্রিংবিল্ডার ব্যবহার করতে হবে -> কারণ স্ট্রিং প্রতিটি সময় গাদা করে নতুন অবজেক্ট তৈরি করে, তবে স্ট্রিংবিল্ডার একই বস্তুটি ফিরিয়ে দেয় ...
মুসা

11

Javadoc পার্থক্য ব্যাখ্যা করে:

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


10

StringBuilder (জাভা 5 তে প্রবর্তিত) এর অনুরূপ StringBuffer এর পদ্ধতিগুলি সিঙ্ক্রোনাইজ করা ব্যতীত । এর অর্থ এটির পরবর্তীগুলির চেয়ে ভাল পারফরম্যান্স রয়েছে তবে ত্রুটিটি এটি থ্রেড-নিরাপদ নয়।

আরও বিশদ জন্য টিউটোরিয়াল পড়ুন ।


6

স্ট্রিংবুফার এবং স্ট্রিংবিল্ডারের মধ্যে পার্থক্য বোঝানোর জন্য একটি সাধারণ প্রোগ্রাম:

/**
 * 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");
        }

    }
}

4

স্ট্রিংবুফার অক্ষর স্ট্রিংগুলি সংরক্ষণ করার জন্য ব্যবহৃত হয় যা পরিবর্তিত হবে (স্ট্রিং অবজেক্টগুলি পরিবর্তন করা যায় না)। এটি স্বয়ংক্রিয়ভাবে প্রয়োজন হিসাবে প্রসারিত হয়। সম্পর্কিত ক্লাস: স্ট্রিং, চারসেকেন্স।

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


4
একক থ্রেডেড প্রোগ্রামগুলি জাভাতে সর্বাধিক সাধারণ ক্ষেত্রে হয় না, তবে StringBuilder‍s সাধারণত কোনও পদ্ধতির কাছে স্থানীয় হয়, যেখানে সেগুলি কেবল একটি থ্রেডে দৃশ্যমান।
25:38

4

StringBufferসিঙ্ক্রোনাইজ করা হয়, কিন্তু StringBuilderহয় না। ফলস্বরূপ, StringBuilderতুলনায় দ্রুত StringBuffer


4

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

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


4

StringBuffer:

  • মাল্টি থ্রেড
  • সুসংগত
  • স্ট্রিংবিল্ডারের চেয়ে ধীর

StringBuilder

  • একক-থ্রেড
  • না সুসংগত
  • স্ট্রিংয়ের চেয়ে দ্রুততর

2
আরও স্পষ্টভাবে, 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 রক্ষা হবে)।
চপ করুন

4

স্ট্রিং-নির্মাতা :

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);  

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


আপনার যদি থ্রেড সুরক্ষার প্রয়োজন হয় তবে স্ট্রিংবুডারকে ব্যবহার করার সর্বোত্তম বিকল্প হ'ল স্ট্রিংবফার কেবল পৃথক ক্রিয়াকলাপের জন্য থ্রেড নিরাপদ। একাধিক ক্রিয়াকলাপের জন্য আপনার সুস্পষ্ট লকিং দরকার।
পিটার লরি

4

StringBuilderএটি সিঙ্ক্রোনাইজ করা না হওয়ায় আরও ভাল ব্যবহার এবং অতএব আরও ভাল পারফরম্যান্স সরবরাহ করে। পুরানো StringBuilderএকটি ড্রপ-ইন প্রতিস্থাপনStringBuffer


3
@ সত্য সত্য তবে বেশিরভাগ সময় StringBu(ff|ild)erস্থানীয় একক পরিবর্তনশীল যা কেবল একটি একক থ্রেড দ্বারা ব্যবহৃত হয়।
গাবুজো

1
@ মার্ক ম্যাককেইনা: এমনকি বহু-থ্রেডযুক্ত অ্যাপ্লিকেশনটিতেও একজনকে প্রায়শই হয় বাহ্যিক লকিং ব্যবহার করতে হয়, বা এড়াতে অতিরিক্ত কাজ করতে হয়। উদাহরণস্বরূপ, যদি দুটি থ্রেড প্রতিটি স্ট্রিংবিল্ডারে একাধিক স্ট্রিং যুক্ত রেকর্ড যুক্ত করতে চায় তবে তাদের ডেটা যোগ করার জন্য সামগ্রিকভাবে যুক্ত করতে হবে এবং তারপরে এটি দ্রুততর - অনুপস্থিত থ্রেডিং ইস্যুগুলির পরেও এটি একটি ইউনিট হিসাবে যুক্ত করতে হবে - সহজভাবে পৃথক সংযোজন ক্রিয়াকলাপগুলির ক্রম সম্পাদন করতে।
সুপারক্যাট

3

যেহেতু StringBufferসিঙ্ক্রোনাইজ করা হয়েছে, এর জন্য কিছু অতিরিক্ত প্রচেষ্টা দরকার, তাই পারফরম্যান্সের উপর ভিত্তি করে, এর চেয়ে কিছুটা ধীর StringBuilder


3

কোন মৌলিক পার্থক্য মধ্যে হয় StringBuilderএবং StringBuffer, মাত্র কয়েক পার্থক্য তাদের মধ্যে বিদ্যমান। ইন StringBufferপদ্ধতি সুসংগত করা হয়। এর অর্থ হল যে এক সময়ে কেবল একটি থ্রেড তাদের উপর পরিচালনা করতে পারে। যদি একাধিক থ্রেড থাকে তবে দ্বিতীয় থ্রেডটি প্রথমটির সমাপ্তির জন্য অপেক্ষা করতে হবে এবং তৃতীয়টি প্রথম এবং দ্বিতীয়টি শেষ হওয়ার জন্য অপেক্ষা করতে হবে এবং এই জাতীয় আরও অনেক কিছু। এটি প্রক্রিয়াটি খুব ধীর করে তোলে এবং তাই এর ক্ষেত্রে কর্মক্ষমতাStringBuffer কম।

অন্যদিকে, StringBuilderসিঙ্ক্রোনাইজ করা হয় না। এর অর্থ হ'ল StringBuilderএকই সময়ে একই সাথে একাধিক থ্রেড পরিচালনা করতে পারে । এটি প্রক্রিয়াটি খুব দ্রুত করে তোলে এবং তাই এর কার্যকারিতা বেশি StringBuilder


3

Stringহ'ল একটি অপরিবর্তনীয় বস্তু যার অর্থ মানটি আর পরিবর্তন করা যায় নাStringBuffer পরিবর্তনীয়।

StringBufferঅত: পর সিঙ্ক্রোনাইজ করা আছে থ্রেড-নিরাপদ যেহেতু StringBuilderশুধুমাত্র একক থ্রেডেড দৃষ্টান্ত না এবং উপযুক্ত।


3
স্ট্রিংবাফারটির কোডটি সিঙ্ক্রোনাইজড থাকার কারণে, স্ট্রিংবুফার থ্রেডসফেটের অগত্যা নয়। নিম্নলিখিত উদাহরণটি বিবেচনা করুন: স্ট্রিংবফার টেস্টিং বাফার = "স্ট্যাকওভারফ্লো"; এখন থ্রেড -১ টেস্টিং বুফারে "1" যুক্ত করার চেষ্টা করছে, এবং থ্রেড -2 "2" কে টেস্টিং বুফারে যুক্ত করার চেষ্টা করছে। এখন যদিও অ্যাপেন্ড () পদ্ধতিটি সিঙ্ক্রোনাইজ করা হয়েছে তবুও আপনি নিশ্চিত হতে পারবেন না যে টেস্টিং বুফারের মান "স্ট্যাকওভারফ্লো 12" বা "স্ট্যাকওভারফ্লো 21" হবে কিনা। আসলে, ওরাকল স্ট্রিংবুডারকে ওভার স্ট্রিংবুফার ব্যবহার করার পরামর্শ দেয়। আমি আশা করি এটি সাহায্য করেছে :)
বিমান ট্রিপথি

2

প্রধান পার্থক্যটি সিঙ্ক্রোনাইজড StringBufferতবে StringBuilderতা নয় you আপনার যদি একাধিক থ্রেড ব্যবহার করার প্রয়োজন হয় তবে স্ট্রিংবুফারের প্রস্তাব দেওয়া হয় B তবে সম্পাদনের গতি অনুযায়ী StringBuilderদ্রুততর হয় StringBuffer, কারণ এটি সিঙ্ক্রোনাইজড নয়।


4
আপনি যদি এটিতে কেবল একটি অপারেশন করেন তবে স্ট্রিংবফার কেবল থ্রেডই নিরাপদ। আমি এটি একাধিক থ্রেডে ব্যবহার করার পরামর্শ দেব না কারণ এটি সঠিকভাবে পাওয়া খুব শক্ত।
পিটার লরি

নিবন্ধন করুন :-)
তামাদ লাং

1
@ b16db0 আমার অর্থ স্ট্রিংবুফারের বেশিরভাগ ব্যবহারগুলি থ্রেড নিরাপদ নয় কারণ তারা বাহ্যিক সুসংহতকরণ ছাড়াই এটিতে একাধিক কল করে ক্লাসকে বরং অর্থহীন করে তোলে।
পিটার ল্যারি

@ পিটারলাউরে আহ এটি স্ট্রিংবাফারের মতো এখনও একটি সুসংগত পরিবেশ প্রয়োজন।
তামাদ ল্যাং

2

এর সিঙ্ক্রোনাইজড অ্যাপেন্ড পদ্ধতির ইন্টারনালগুলি 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সংযোজন পদ্ধতিতে না থাকার কারণে দ্রুত ।


1

স্ট্রিং বনাম স্ট্রিংবফার বনাম স্ট্রিংবুডার এর পারফরম্যান্স পরীক্ষার ফলাফল এখানে । অবশেষে, স্ট্রিংবিল্ডার টেস্টটি জিতেছিলেন। পরীক্ষার কোড এবং ফলাফলের জন্য নীচে দেখুন।

কোড :

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

1
  • স্ট্রিংবুফার থ্রেড-নিরাপদ তবে স্ট্রিংবুডার থ্রেড নিরাপদ নয়।
  • স্ট্রিংবুডার স্ট্রিংবুফারের চেয়ে দ্রুত।
  • স্ট্রিংবুফার সিঙ্ক্রোনাইজ করা হয় যেখানে স্ট্রিংবুডার সিঙ্ক্রোনাইজ করা হয় না।

1

স্ট্রিংবুফার সিঙ্ক্রোনাইজড এবং থ্রেড নিরাপদ, স্ট্রিংবুডার সিঙ্ক্রোনাইজড এবং দ্রুত নয়।


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