StringBuilder සහ StringBuffer අතර වෙනස


1591

StringBufferසහ අතර ඇති ප්‍රධාන වෙනස StringBuilderකුමක්ද? මේවායින් එකක් තීරණය කිරීමේදී කාර්ය සාධන ගැටළු තිබේද?

Answers:


1675

StringBufferසමමුහුර්ත කර ඇත, StringBuilderනැත.


239
සහ StringBuilder යනු සමමුහුර්තකරණය අවශ්‍ය නොවන StringBuffer වෙනුවට ආදේශ කිරීමකි
ජොයෙල්

95
සමමුහුර්තකරණය කිසි විටෙකත් අවශ්‍ය නොවේ. යමෙකුට StringBuilder එකක සමමුහුර්ත කිරීමට අවශ්‍ය නම්, ඔවුන්ට සමමුහුර්ත (sb) with with සමඟ කේතයේ මුළු කොටසම වට කළ හැකිය
locka

23
@locka මම තර්ක කරන්නේ ස්ට්‍රිං බෆර් කිසි විටෙකත් හොඳ අදහසක් නොවන බවයි (ඔබට ඒපීඅයි එකක් අවශ්‍ය නම් මිස) vanillajava.blogspot.de/2013/04/…
පීටර් ලෝරි

8
StringBuffer සඳහා මා දකින එකම ස්ථානය ප්‍රතිදානය සහ විවිධ ල ging ු-සටහන් උපයෝගීතාව වැනි කොන්සෝලයයි: බොහෝ නූල් ගැටුම් වලදී ප්‍රතිදානය කළ හැකිය. ප්‍රතිදානය 2 ක් මිශ්‍ර වීමට ඔබට අවශ්‍ය නැති නිසා ... නමුත් සාමාන්‍යයෙන් ස්ට්‍රිං බෆර් මට්ටමින් සමමුහුර්ත කිරීම ඉතා පහත් මට්ටමක පවතින බැවින්, ඔබට ලෙවල්ම් වැනි ඇපෙන්ඩරයක සමමුහුර්ත කිරීමට අවශ්‍ය වනු ඇත, එබැවින් ලොකා පිළිතුර හොඳම වන අතර ස්ට්‍රිං බෆර් ඉවත් කළ යුතුය. එය නවකයන් සමඟ කේත සමාලෝචන කාලය ඉතිරි කරයි.
රෙමී මොරින්

20
මේ දෙක මිශ්‍ර කරන අයට හොඳ සිහිවටනයක් - බුෆර් පළමු, පැරණි සහ ඒ නිසා සමමුහුර්ත ක්‍රියාත්මක කිරීම. නව බිල්ඩර් පන්තිය බිල්ඩර් රටාව භාවිතා කරන අතර එය අසමමුහුර්ත වේ.
ඩේටජීක්

729

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
ඔබ පෙර උණුසුම් කිරීමට අවශ්යයි. මෙම පරීක්ෂණය StringBuffer ට අසාධාරණයි. එසේම, එය ඇත්ත වශයෙන්ම යමක් එකතු කළහොත් එය හොඳ ය. ඇත්තටම, මම පරීක්ෂණය පෙරළා, අහඹු නූලක් එකතු කර ප්‍රතිවිරුද්ධ පරීක්ෂණය ලබා ගත්තා. සරල මිණුම් සලකුණු විශ්වාස කළ නොහැකි බව පැවසීමට යයි. ප්‍රතිවිරුද්ධ දෙය නම් StringBuffer වේගවත් බවයි. 5164 සඳහා StringBuilder vs 3699 සඳහා StringBuffer hastebin.com/piwicifami.avrasm
mmm

77
මම ලූපයකින් දකින පළමු අවස්ථාව මෙයයි --> 0. එහි තේරුම වටහා ගැනීමට මට මොහොතක් ගත විය. මෙය සුපුරුදු ...; i > 0; i--සින්ටැක්ස් වෙනුවට ප්‍රායෝගිකව භාවිතා කරන දෙයක්ද?
රයිමන්ඩ් ක්‍රෝමර්

21
එය i -->සැබවින්ම කරදරකාරී වාක්‍ය ඛණ්ඩයකි ... ASCII කලාව පිළිබඳ අදහස් දැක්වීම නිසා එය මුලින් ඊතලයක් යැයි මම සිතුවෙමි.
සමීර් පූරි

14
අනෙක් ඒවා විවිධ ප්‍රති results ල සමඟ අවසන් වේ: alblue.bandlem.com/2016/04/jmh-stringbuffer-stringbuilder.html . main()මිණුම් සලකුණු සැබවින්ම කළ යුත්තේ ජේඑම්එච් සමඟ මිස සරලව නොවේ . ඔබේ මිණුම් ලකුණ අසාධාරණ ය. උණුසුම් කිරීමක් නැත.
ලූකස් ඊඩර්

250

මූලික වශයෙන්, StringBufferක්‍රම සමමුහුර්ත කර ඇති අතරStringBuilder වේ.

මෙහෙයුම් "පාහේ" සමාන වේ, නමුත් තනි නූල් එකක සමමුහුර්ත ක්‍රම භාවිතා කිරීම අතිරික්ත වේ.

ඒක ගොඩක් වටිනවා.

StringBuilder API වෙතින් උපුටා ගැනීම :

මෙම පන්තිය [StringBuilder] විසින් StringBuffer සමඟ අනුකූල API ලබා දෙයි, නමුත් සමමුහුර්තකරණය පිළිබඳ සහතිකයක් නොමැත . මෙම පන්තිය නිර්මාණය කර ඇත්තේ තනි නූල් එකකින් (සාමාන්‍යයෙන් මෙන්) නූල් බෆරය භාවිතා කරන ස්ථානවල ස්ට්‍රිං බෆර් වෙනුවට ඩ්‍රොප්-ඉන් ආදේශකයක් ලෙසය. හැකි සෑම අවස්ථාවකදීම, මෙම පන්තිය StringBuffer ට වඩා මනාපයෙන් භාවිතා කිරීම රෙකමදාරු කරනු ලැබේ.

එබැවින් එය ආදේශ කිරීම සඳහා සාදන ලදී.

Vectorසහ සිදු වූයේ ද එයමය ArrayList.


1
සමඟ Hashtableසහ HashMap.
shmosel

177

නමුත් උදාහරණයක උපකාරයෙන් පැහැදිලි වෙනසක් ලබා ගැනීමට අවශ්‍යද?

StringBuffer හෝ StringBuilder

StringBuilderඔබ නූල් අතර බෆරයක් බෙදා ගැනීමට උත්සාහ නොකරන්නේ නම් සරලව භාවිතා කරන්න. StringBuilderමුල් සමමුහුර්ත StringBufferපන්තියේ සමමුහුර්ත නොකළ (අඩු පොදු = වඩා කාර්යක්ෂම) බාල සහෝදරයා වේ .

StringBufferමුලින්ම ආවා. සෑම තත්වයක් යටතේම සූර්යයා නිරවද්‍යතාව ගැන සැලකිලිමත් වූ අතර, එම නිසා ඔවුන් එය සමමුහුර්ත කර එය නූල් ආරක්ෂිත බවට පත් කළේය.

StringBuilderපසුව ආවා. බොහෝ භාවිතයන්StringBuffer තනි නූල් සහ සමමුහුර්ත කිරීමේ පිරිවැය අනවශ්‍ය ලෙස ගෙවීමයි.

StringBuilderසඳහා අතහැර දැමීමේ ආදේශකයක් බැවින්StringBuffer සමමුහුර්ත තොරව, ඕනෑම අයෙකුට ඕනෑම උදාහරණ අතර වෙනස්කම් තිබිය නැත.

ඔබ නම් කරන නූල් අතර කොටස් උත්සාහ, ඔබ භාවිතා කළ හැකිය StringBuffer, නමුත් ඉහල මට්ටමේ සමමුහුර්ත අවශ්ය ද යන්න සලකා, උදා: සමහර විට StringBuffer භාවිතා කරනු වෙනුවට, ඔබ StringBuilder භාවිතා කරන ක්රම අතළොස්සට යුතුය.


14
පළමු හොඳ පිළිතුර !! කාරණය වන්නේ "ඔබ නූල් අතර බෆරයක් බෙදා නොගන්නේ නම්"
ඇලෙක්ස්වීන්

1
ඉතා සවිස්තරාත්මක පිළිතුර!
රාවුල්

82

පළමුවෙන්ම සමානකම් දැකීමට ඉඩ දෙන්න : StringBuilder සහ StringBuffer යන දෙකම විකෘති වේ. ඒ කියන්නේ ඔබට ඒවායේ අන්තර්ගතය එකම ස්ථානයකින් වෙනස් කළ හැකිය.

වෙනස්කම් : StringBuffer විකෘති වන අතර සමමුහුර්ත කර ඇත. StringBuilder විකෘති වන නමුත් පෙරනිමියෙන් සමමුහුර්ත කර නොමැත.

සමමුහුර්ත කිරීමේ තේරුම (සමමුහුර්තකරණය) : යම් දෙයක් සමමුහුර්ත කළ විට, බහු නූල් වලට ප්‍රවේශ විය හැකි අතර ඕනෑම ගැටළුවක් හෝ අතුරු ආබාධයකින් එය වෙනස් කළ හැකිය. StringBuffer සමමුහුර්ත කර ඇත, එබැවින් ඔබට ඕනෑම ගැටළුවක් නොමැතිව බහු නූල් භාවිතා කළ හැකිය.

කුමන විට භාවිතා කළ යුතුද? StringBuilder: ඔබට නූලක් අවශ්‍ය වූ විට එය වෙනස් කළ හැකි අතර එක් නූල් එකක් පමණක් එයට ප්‍රවේශ වීම සහ වෙනස් කිරීම සිදු කරයි. StringBuffer: ඔබට නූලක් අවශ්‍ය වූ විට එය වෙනස් කළ හැකි අතර බහු නූල් එයට ප්‍රවේශ වී වෙනස් කරයි.

සටහන : StringBuffer අනවශ්‍ය ලෙස භාවිතා නොකරන්න, එනම්, එක් නූල් එකක් පමණක් වෙනස් කර ප්‍රවේශ කරන්නේ නම් එය භාවිතා නොකරන්න, එයට සමමුහුර්තකරණය සඳහා අගුළු ඇරීමේ සහ අගුළු හැරීමේ කේත විශාල ප්‍රමාණයක් ඇති බැවින් අනවශ්‍ය ලෙස CPU කාලය ගතවනු ඇත. අවශ්‍ය නම් අගුල් භාවිතා නොකරන්න.


2
StringBuffer හි INDIVIDUAL ක්‍රමයේ ඇමතුම් නූල් ආරක්ෂිත බව සඳහන් කිරීමට අවශ්‍යය. නමුත් ඔබට කේත පේළි කිහිපයක් තිබේ නම්, නූල්-ආරක්ෂාව සහතික කිරීම සඳහා සමමුහුර්ත කේත වාරණයක් භාවිතා කරන්න, සමහර අගුළු / මොනිටරයකින් (සුපුරුදු පරිදි ...). මූලික වශයෙන්, නූල්-ආරක්ෂිත පුස්තකාලයක් භාවිතා කිරීම වහාම ඔබේ වැඩසටහනේ නූල් ආරක්ෂාව සහතික කරයි යැයි නොසිතන්න!
කෙවින් ලී

57

තනි නූල් වලදී , JVM ප්‍රශස්තිකරණයට ස්තූතිවන්ත වන පරිදි StringBuffer StringBuilder ට වඩා සැලකිය යුතු ලෙස මන්දගාමී නොවේ . බහුමාධ්‍ය කියවීමේදී ඔබට ආරක්ෂිතව 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));
}


ප්‍රති Results ල : නූල්: 319740 ස්වාරක්ෂක
: 23
තනන්නා: 7!

එබැවින් ඉදි කරන්නන් බෆරයට වඩා වේගවත් වන අතර, නූල් සංයුක්තයට වඩා වේගවත් වේ. දැන් අපි බහු නූල් සඳහා ක්‍රියාත්මක කරන්නෙකු භාවිතා කරමු :

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

දැන් StringBuffers 100000 එකතු කිරීම් සඳහා 157 ms ගනී . එය එකම පරීක්ෂණය නොවේ, නමුත් පෙර 37 එම්එස් සමඟ සසඳන විට, බහු තෙරපුම් භාවිතයෙන් ස්ට්‍රිං බෆර්ස් එකතු කිරීම මන්දගාමී යැයි ඔබට ආරක්ෂිතව උපකල්පනය කළ හැකිය . හේතුව, අගුල් පරීක්ෂා කිරීමේ අවශ්‍යතාවයක් නොමැති බව අනාවරණය වූ විට JIT / හොට්ස්පොට් / සම්පාදක / යමක් ප්‍රශස්තිකරණය කරයි .

නමුත් StringBuilder සමඟ, ඔබට java.lang.ArrayIndexOutOfBoundsException ඇත , මන්ද සමගාමී නූල් එය නොකළ යුතු තැනක් එක් කිරීමට උත්සාහ කරයි.

නිගමනය නම් ඔබට StringBuffers පසුපස හඹා යා යුතු නැති බවයි. ඔබට නූල් ඇති තැන, නැනෝ තත්පර කිහිපයක් ලබා ගැනීමට උත්සාහ කිරීමට පෙර, ඔවුන් කරන්නේ කුමක්ද යන්න ගැන සිතා බලන්න.


5
ඔබට කිරීමට අමතක වී ඇත "t0 = System.currentTimeMillis ();" StringBuilder පරීක්ෂණය කිරීමට පෙර. එබැවින් StringBuilder සඳහා පෙන්වන රූපය ඇත්ත වශයෙන්ම stringbuffer සහ stringbuilder පරීක්ෂණය ක්‍රියාත්මක කිරීමට ගතවන කාලයයි. මෙම රේඛාව එක් කරන්න, ඔබට ස්ට්‍රිංබිල්ඩර් දෙවරක් වේගවත් බව පෙනෙනු ඇත.
ජෙනා බැට්සියන්

withString+="some string"+i+" ; ";අනෙක් ලූප දෙකට සමාන නොවන බවත් එබැවින් සාධාරණ සංසන්දනයක් නොවන බවත් සලකන්න .
ඩේව් ජාවිස්

නිවැරදි, නිවැරදි කර ඇත. සිතුවිලි නූල් තවමත් ඉතා මන්දගාමී ය.
නිකොලස් සොසෝල්

StringBuilder
Alireza Fattahi

මිණුම් සලකුණු සඳහා ඔබ JMH භාවිතා කළ යුතුය. ඔබේ මිණුම් ලකුණ ඇත්ත වශයෙන්ම සාවද්‍ය ය.
ලූකස් ඊඩර්

42

StringBuilder ජාවා 1.5 හි හඳුන්වා දෙන ලදි, එබැවින් එය පෙර JVM සමඟ ක්‍රියා නොකරනු ඇත.

සිට Javadocs :

StringBuilder පන්තිය StringBuffer සමඟ අනුකූල API ලබා දෙයි, නමුත් සමමුහුර්තකරණය පිළිබඳ සහතිකයක් නොමැත. මෙම පන්තිය නිර්මාණය කර ඇත්තේ තනි නූල් එකකින් (සාමාන්‍යයෙන් මෙන්) නූල් බෆරය භාවිතා කරන ස්ථානවල ස්ට්‍රිං බෆර් වෙනුවට ඩ්‍රොප්-ඉන් ආදේශකයක් ලෙසය. හැකි සෑම අවස්ථාවකදීම, මෙම පන්තිය StringBuffer ට වඩා මනාපයෙන් භාවිතා කිරීම රෙකමදාරු කරනු ලැබේ.


13
1.4 එහි සේවා කාලය අවසානයේ ඇති බැවින් 1.5 ට පෙර කරදර වීම වටී.
ටොම් හෝවින් -

@ tomHawtin-tackline අවශ්‍ය නොවේ - 1.4 ට පෙර ව්‍යවසාය නිෂ්පාදන අප බොහෝ දෙනා දිනපතා භාවිතා කරයි. බ්ලැක්බෙරි ජාවා 1.4 මත පදනම් වූ අතර එය තවමත් ඉතා වර්තමාන ය.
රිචඩ් ලෙ මෙසුරියර්

සීඩීසී සහ සීඑල්ඩීසී සතුව නැත StringBuilder.
ජින් ක්වොන්

37

හොඳ ප්‍රශ්නයක්

මෙන්න වෙනස්කම්, මම දැක ඇත්තෙමි:

StringBuffer: -

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

StringBuilder නූල් ආරක්ෂිත නොවේ. නූල් බෆරය. වැඩි විස්තර මෙහි .

සංස්කරණය කරන්න: කාර්ය සාධනය සම්බන්ධයෙන් ගත් කල, හොට්ස්පොට් ආරම්භ වූ පසු , ජයග්‍රාහකයා වන්නේ ස්ට්‍රිංබිල්ඩර් ය. කෙසේ වෙතත්, කුඩා පුනරාවර්තන සඳහා, කාර්ය සාධන වෙනස නොසැලකිය.


21

StringBuilderහා StringBufferපාහේ සමාන වේ. වෙනස වන්නේ StringBufferඑය සමමුහුර්ත කර ඇති අතර StringBuilderඑසේ නොවේ. StringBuilderවඩා වේගවත් වුවද, StringBufferකාර්ය සාධනයේ වෙනස ඉතා අල්පය. StringBuilderSUN වෙනුවට ආදේශ කිරීමකි StringBuffer. එය සියලු පොදු ක්‍රම වලින් සමමුහුර්තකරණය වළක්වයි. ඒ වෙනුවට ඔවුන්ගේ ක්‍රියාකාරිත්වය සමාන වේ.

හොඳ භාවිතයේ උදාහරණය:

ඔබේ පෙළ වෙනස් වීමට යන්නේ නම් සහ බහු නූල් භාවිතා කරන්නේ නම්, එය භාවිතා කිරීම වඩා හොඳය StringBuffer. ඔබේ පෙළ වෙනස් වීමට යන්නේ නමුත් තනි නූල් භාවිතා කරන්නේ නම් භාවිතා කරන්න StringBuilder.


19

StringBuffer

StringBuffer යනු විකෘති වන අතර කෙනෙකුට වස්තුවේ වටිනාකම වෙනස් කළ හැකිය. StringBuffer හරහා නිර්මාණය කරන ලද වස්තුව ගොඩවල් තුළ ගබඩා වේ. StringBuffer හි StringBuilder හා සමාන ක්‍රම ඇත, නමුත් StringBuffer හි සෑම ක්‍රමයක්ම සමමුහුර්ත කර ඇති අතර එය StringBuffer නූල් ආරක්ෂිත වේ.

මේ නිසා එකම ක්‍රමයට එකවර ප්‍රවේශ වීමට නූල් දෙකකට ඉඩ නොදේ. සෑම ක්රමයක්ම වරකට එක් නූල් එකකින් ප්රවේශ විය හැකිය.

නූල් ආරක්ෂිත දේපල හේතුවෙන් ස්ට්‍රිං බෆරයේ ක්‍රියාකාරිත්වය වැඩි වන බැවින් නූල් ආරක්ෂිත වීම අවාසි ද ඇත. මේ අනුව එක් එක් පන්තියේ එකම ක්‍රම කැඳවීමේදී StringBuilder StringBuffer ට වඩා වේගවත් වේ.

StringBuffer අගය වෙනස් කළ හැකිය, එයින් අදහස් කරන්නේ එය නව අගයට පැවරිය හැකි බවයි. වර්තමානයේ එය වඩාත් සුලභ සම්මුඛ පරීක්ෂණ ප්‍රශ්නයකි, ඉහත පන්ති අතර වෙනස්කම්. ToString () ක්‍රමය භාවිතා කරමින් නූල් බෆරය නූල් බවට පරිවර්තනය කළ හැකිය.

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 යනු StringBuffer හා සමාන වේ, එනම් එය වස්තුව ගොඩවල් තුළ ගබඩා කරන අතර එය වෙනස් කළ හැකිය. StringBuffer සහ StringBuilder අතර ඇති ප්‍රධාන වෙනස නම් StringBuilder ද නූල් ආරක්ෂිත නොවේ. නූල් ආරක්ෂිත නොවන බැවින් 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 Vs StringBuffer Vs StringBuilder


StringBuilder වෙනස් කළ නොහැකි අතර සංගීත වර්ගය විකෘති වේ
Brinda Rathod

ස්ට්‍රිං සහ ස්ට්‍රිංබිල්ඩර්ස් “වේගවත්” සහ ස්ට්‍රිං බෆර් “ඉතා මන්දගාමී” බව මම එකඟ නොවෙමි. ඉහත පිළිතුරු බලන්න.
ෆයර්කියුබ්ස්

17

String වෙනස් කළ නොහැකි ය.

StringBuffer විකෘති හා සමමුහුර්තකරණයකි.

StringBuilder විකෘති වන නමුත් එය සමමුහුර්ත කර නොමැත.


මීට අමතරව, මෙම නූල් ආරක්‍ෂිත දත්ත වෙත ප්‍රවේශ වීම සඳහා ස්ට්‍රිංබෆර් නූල් අගුළු දමයි. StringBuilder නූල් අගුළු නොදමන අතර එය බහු නූල් ආකාරයෙන් ධාවනය වන්නේ ඒ නිසාය. සංගීත - ඔබ concatenate string අවශ්ය නොවන විට මෙම හොඳ ක්රමයකි, නමුත් ඔබ එය StringBuilder භාවිතා අවශ්ය වන විට -> සංගීත ගොඩක් සෑම අවස්ථාවකදීම අලුත් වස්තු නිර්මාණය නිසා, නමුත් StringBuilder එම වස්තුව නැවත ...
මූසා

11

මෙම javadoc වෙනස පැහැදිලි:

මෙම පන්තිය ස්ට්‍රිං බෆර් සමඟ අනුකූල API ලබා දෙයි, නමුත් සමමුහුර්තකරණය පිළිබඳ සහතිකයක් නොමැත. මෙම පන්තිය නිර්මාණය කර ඇත්තේ තනි නූල් එකකින් (සාමාන්‍යයෙන් මෙන්) නූල් බෆරය භාවිතා කරන ස්ථානවල ස්ට්‍රිං බෆර් වෙනුවට ඩ්‍රොප්-ඉන් ආදේශකයක් ලෙසය. හැකි සෑම අවස්ථාවකදීම, මෙම පන්තිය StringBuffer ට වඩා මනාපයෙන් භාවිතා කිරීම රෙකමදාරු කරනු ලැබේ.


10

StringBuilder (ජාවා 5 හි හඳුන්වා දී ඇත) සමාන වේ StringBuffer එහි ක්‍රම සමමුහුර්ත කර නොමැති . මෙයින් අදහස් කරන්නේ එය දෙවැන්නට වඩා හොඳ කාර්ය සාධනයක් ඇති නමුත් අවාසිය නම් එය නූල් ආරක්ෂිත නොවන බවයි.

වැඩි විස්තර සඳහා නිබන්ධනය කියවන්න .


6

StringBuffer සහ StringBuilder අතර වෙනස නිරූපණය කරන සරල වැඩසටහනක්:

/**
 * 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

වෙනස් වන අක්ෂර නූල් ගබඩා කිරීම සඳහා StringBuffer භාවිතා කරයි (සංගීත වස්තු වෙනස් කළ නොහැක). අවශ්‍ය පරිදි එය ස්වයංක්‍රීයව පුළුල් වේ. ආශ්‍රිත පන්ති: නූල්, චාර්සෙක්ස්.

StringBuilder ජාවා 5 හි එකතු කරන ලදි. එය සමමුහුර්ත කර නොමැති බව හැරෙන්නට එය StringBuffer ට සෑම ආකාරයකින්ම සමාන වේ, එයින් අදහස් වන්නේ එකවර බහු නූල් එයට ප්‍රවේශ වන්නේ නම් කරදර ඇතිවිය හැකි බවයි. තනි-නූල් වැඩසටහන් සඳහා, වඩාත් පොදු අවස්ථාව, සමමුහුර්තකරණයට ඉහළින් සිටීම වළක්වා ගැනීම, StringBuilder තරමක් වේගවත් කරයි.


4
තනි නූල් සහිත වැඩසටහන් ජාවාහි වඩාත් සුලභ අවස්ථාව නොවේ, නමුත් StringBuilder s සාමාන්‍යයෙන් ක්‍රමයකට දේශීය වේ, එහිදී ඒවා දෘශ්‍ය වන්නේ එක් නූල් එකකට පමණි.
finnw

4

StringBufferසමමුහුර්ත කර ඇත, නමුත් StringBuilderඑසේ නොවේ. ප්රති result ලයක් වශයෙන්, StringBuilderවඩා වේගවත් වේ StringBuffer.


4

StringBuffer විකෘති වේ. දිග හා අන්තර්ගතය අනුව එය වෙනස් විය හැකිය. StringBuffers යනු නූල්-ආරක්ෂිත වන අතර, එයින් අදහස් වන්නේ ප්‍රවේශය පාලනය කිරීම සඳහා සමමුහුර්ත ක්‍රම ඇති බැවින් එක වරකට StringBuffer වස්තුවක සමමුහුර්ත කේතයට ප්‍රවේශ විය හැක්කේ එක් නූල් එකකට පමණක් බවයි. මේ අනුව, StringBuffer වස්තු සාමාන්‍යයෙන් බහු නූල් සහිත පරිසරයක භාවිතා කිරීමට ආරක්ෂිත වන අතර එහිදී එකම නූල් බෆර වස්තුවට එකවර පිවිසීමට බහු නූල් උත්සාහ කළ හැකිය.

StringBuilder නූල් ආරක්ෂිත නොවන පරිදි එහි ප්‍රවේශය සමමුහුර්ත කර නොමැති බව හැර, StringBuilder පන්තිය StringBuffer ට බෙහෙවින් සමාන ය. සමමුහුර්ත නොකිරීමෙන්, StringBuilder හි ක්‍රියාකාරීත්වය StringBuffer ට වඩා හොඳ විය හැකිය. මේ අනුව, ඔබ වැඩ කරන්නේ තනි නූල් සහිත පරිසරයක නම්, StringBuffer වෙනුවට StringBuilder භාවිතා කිරීමෙන් කාර්ය සාධනය වැඩි විය හැකිය. StringBuilder දේශීය විචල්‍යයක් (එනම්, ක්‍රමයක් තුළ විචල්‍යයක්) වැනි වෙනත් අවස්ථාවන්හිදී ද මෙය සත්‍ය වේ, එහිදී එක් නූල් එකක් පමණක් StringBuilder වස්තුවකට ප්‍රවේශ වේ.


4

StringBuffer:

  • බහු නූල්
  • සමමුහුර්ත
  • StringBuilder වලට වඩා සෙමින්

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();එක් ස්ට්‍රිංබිල්ඩර් ක්ෂණිකත්වයක් ඉතිරි කරන අතරම).
චොප්

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

හැකි සෑම විටම StringBuilder භාවිතා කිරීම රෙකමදාරු කරනුයේ එය StringBuffer ට වඩා වේගවත් බැවිනි. කෙසේ වෙතත්, නූල් ආරක්ෂාව අවශ්‍ය නම්, හොඳම විකල්පය වන්නේ StringBuffer වස්තු ය.


ඔබට නූල් ආරක්ෂාව අවශ්‍ය නම්, හොඳම විකල්පය වන්නේ StringBuilder භාවිතා කිරීම StringBuffer තනි මෙහෙයුම් සඳහා නූල් පමණක් ආරක්ෂිත වීමයි. බහු මෙහෙයුම් සඳහා, ඔබට පැහැදිලි අගුලු දැමීම අවශ්‍ය වේ.
පීටර් ලෝරි

4

වඩා හොඳ භාවිතය StringBuilderනිසා එය නොවේ සමමුහුර්ත නිසා වඩා හොඳ කාර්ය සාධනය සහ දීමනා. StringBuilderයනු පැරණි දේ වෙනුවට ආදේශ කිරීමකි StringBuffer.


3
Ark සත්‍ය ලෙස සලකුණු කරන්න, නමුත් බොහෝ StringBu(ff|ild)erවිට දේශීය විචල්‍යයක් වන්නේ තනි නූල් එකකින් පමණි.
gabuzo

1
ArkMarkMcKenna: බහු-නූල් යෙදුමක වුවද, බොහෝ විට කෙනෙකුට බාහිර අගුළු භාවිතා කිරීමට සිදු වේ, නැතහොත් එය වළක්වා ගැනීම සඳහා අමතර වැඩක් කළ යුතුය. නිදසුනක් ලෙස, නූල් දෙකක් බැගින් නූල් සාදන්නෙකුට බහුවිධ නූල් අඩංගු වාර්තාවක් එකතු කිරීමට අවශ්‍ය නම්, ඔවුන්ට එකතු කළ යුතු දත්ත එකතු කර එය වේගවත් වුවද ඒකකයක් ලෙස එකතු කළ යුතුය - නූල් ගැටලු නොමැති නම් - විවික්ත උපග්‍රන්ථ මෙහෙයුම් මාලාවක් සරලව සිදු කිරීමට.
සුපර් කැට්

3

StringBufferසමමුහුර්ත කර ඇති බැවින් , එයට අමතර වෑයමක් අවශ්‍ය වේ, එබැවින් සිදුරු මත පදනම්ව, එය ටිකක් මන්දගාමී වේ StringBuilder.


3

එහි අතර කිසිදු මූලික වෙනස්කම් StringBuilderහා StringBufferඔවුන් අතර වෙනස්කම් කීපයක් පමණක් පවතී. දී StringBufferක්රම සමමුහුර්ත කර ඇත. මෙයින් අදහස් කරන්නේ වරකට ඒවා ක්‍රියාත්මක කළ හැක්කේ එක් නූල් එකක් පමණක් බවයි. එක් නූල් එකකට වඩා තිබේ නම්, දෙවන නූල් පළමු එක අවසන් වන තෙක් බලා සිටිය යුතු අතර තුන්වන එක පළමු හා දෙවන එක අවසන් වන තෙක් බලා සිටිය යුතුය. මෙමඟින් ක්‍රියාවලිය ඉතා මන්දගාමී වන අතර එම නිසා කාර්ය සාධනය StringBufferඅඩු වේ.

අනෙක් අතට, StringBuilderසමමුහුර්ත කර නොමැත. මෙයින් අදහස් කරන්නේ වරකට එකම StringBuilderවස්තුවක් මත එකවර බහු නූල් ක්‍රියාත්මක විය හැකි බවයි. මෙමඟින් ක්‍රියාවලිය ඉතා වේගවත් වන අතර එම නිසා කාර්ය සාධනය StringBuilderඉහළ මට්ටමක පවතී.


3

A Stringයනු වෙනස් කළ නොහැකි වස්තුවකි, එයින් අදහස් වන්නේ අගය වෙනස් කළ නොහැකි අතර StringBufferවිකෘති වන බවයි.

මෙම StringBufferෙහයින්ද, ඒ නිසා නූල්-ආරක්ෂිත වෙළඳ පොළෙන් ඇත StringBuilderඑකම තනි-පොටවල් අවස්ථා සඳහා සුදුසු නොවන හා.


3
StringBuffer සමමුහුර්ත කේතය ඇති නිසා, StringBuffer නූල් ආරක්ෂිත යැයි අදහස් නොකෙරේ. පහත උදාහරණය සලකා බලන්න: StringBuffer testingBuffer = "stackoverflow"; දැන් Thread-1 ටෙස්ට් බෆරයට "1" එකතු කිරීමට උත්සාහ කරන අතර Thread-2 ටෙස්ට් බෆරයට "2" එකතු කිරීමට උත්සාහ කරයි. දැන් append () ක්‍රමය සමමුහුර්ත කර ඇතත්, පරීක්ෂණ බෆරයේ වටිනාකම "stackoverflow12" හෝ "stackoverflow21" වේ දැයි ඔබට සහතික විය නොහැක. ඇත්ත වශයෙන්ම, ඔරකල් විසින් උපදෙස් දෙනුයේ stringbuffer හරහා stringbuilder භාවිතා කරන ලෙසයි. මෙය උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි :)
බිමන් ත්‍රිපාති

2

ප්‍රධාන වෙනස වන්නේ StringBufferසමමුහුර්ත කර ඇති නමුත් StringBuilderඑසේ නොවේ. ඔබට නූල් එකකට වඩා භාවිතා කිරීමට අවශ්‍ය නම්, StringBuffer නිර්දේශ කරනු ලැබේ.නමුත්, ක්‍රියාත්මක කිරීමේ වේගය StringBuilderඅනුව වේගවත් StringBufferවන බැවින් එය සමමුහුර්ත වී නොමැත.


4
StringBuffer එක නූල් ආරක්ෂිත වන්නේ ඔබ එය මත එක් මෙහෙයුමක් කළහොත් පමණි. එය නිවැරදිව ලබා ගැනීම ඉතා අසීරු බැවින් මම එය බහු නූල් වලින් භාවිතා කිරීම නිර්දේශ නොකරමි.
පීටර් ලෝරි

Et පීටර්ලව්රි ඔබ අදහස් කළේ කුමක්ද? :-)
damat-perdigannat

1
16 b16db0 මම අදහස් කළේ බාහිර සමමුහුර්තකරණයකින් තොරව StringBuffer හි බොහෝ භාවිතයන් නූල් ආරක්ෂිත නොවන බැවින් පන්තිය අර්ථ විරහිත කරයි.
පීටර් ලෝරි

EtPeterLawrey අහ් එය හරියට StringBuffer ට තවමත් සමමුහුර්ත පරිසරයක් අවශ්‍යයි.
damat-perdigannat

2

සමමුහුර්ත එකතු කිරීමේ ක්‍රමයේ StringBufferසහ සමමුහුර්ත නොවන උපග්‍රන්ථයේ අභ්‍යන්තරය පරීක්ෂා කරන්න StringBuilder.

StringBuffer :

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

StringBuilder :

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

String vs StringBuffer vs StringBuilder සඳහා කාර්ය සාධන පරීක්ෂණ ප්‍රති result ලය මෙන්න . අවසානයේ ස්ට්‍රිංබිල්ඩර් ටෙස්ට් තරගය ජය ගත්තේය. පරීක්ෂණ කේතය සහ ප්‍රති .ල සඳහා පහත බලන්න.

කේතය :

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

  }

අයිඩියොන් මත මාව ක්‍රියාත්මක කරන්න

ප්‍රති ult ලය :

තනි පෙළක් එක් කිරීම සඳහා 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
  • StringBuffer නූල්-ආරක්ෂිත නමුත් StringBuilder නූල් ආරක්ෂිත නොවේ.
  • StringBuilder යනු StringBuffer ට වඩා වේගවත්ය.
  • StringBuffer සමමුහුර්ත කර ඇති අතර StringBuilder සමමුහුර්ත කර නොමැත.

1

StringBuffer සමමුහුර්ත කර ඇති අතර නූල් ආරක්ෂිතයි, StringBuilder සමමුහුර්ත හා වේගවත් නොවේ.


මෙම ප්‍රශ්නයට අනෙක් සියලුම පිළිතුරු වල මෙම වෙනස ලබා දී ඇත. ඔබට අලුත් දෙයක් ඉස්මතු කළ හැකිද?
නිකෝ හේස්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.