stringbuffer和stringbuilder有什么區(qū)別?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
站在用戶的角度思考問題,與客戶深入溝通,找到滁州網(wǎng)站設(shè)計與滁州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋滁州地區(qū)。
StringBuffer、StringBuilder區(qū)別
StringBuffer與 StringBuilder中的方法和功能完全是等價的,只是StringBuffer中的方法大都采用了synchronized關(guān)鍵字進(jìn)行修飾,因此是線程安全的,支持并發(fā)操作,適合多線程中使用。StringBuilder不支持并發(fā)操作,線性不安全的,不適合多線程中使用。新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。
接下來,我直接貼上測試過程和結(jié)果的代碼,一目了然:
public class StringTest { public static String BASEINFO = "Mr.Y"; public static final int COUNT = 2000000; /** * 執(zhí)行一項String賦值測試 */ public static void doStringTest() { String str = new String(BASEINFO); long starttime = System.currentTimeMillis(); for (int i = 0; i < COUNT / 100; i++) { str = str + "miss"; } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used String."); } /** * 執(zhí)行一項StringBuffer賦值測試 */ public static void doStringBufferTest() { StringBuffer sb = new StringBuffer(BASEINFO); long starttime = System.currentTimeMillis(); for (int i = 0; i < COUNT; i++) { sb = sb.append("miss"); } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used StringBuffer."); } /** * 執(zhí)行一項StringBuilder賦值測試 */ public static void doStringBuilderTest() { StringBuilder sb = new StringBuilder(BASEINFO); long starttime = System.currentTimeMillis(); for (int i = 0; i < COUNT; i++) { sb = sb.append("miss"); } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used StringBuilder."); } /** * 測試StringBuffer遍歷賦值結(jié)果 * * @param mlist */ public static void doStringBufferListTest(Listmlist) { StringBuffer sb = new StringBuffer(); long starttime = System.currentTimeMillis(); for (String string : mlist) { sb.append(string); } long endtime = System.currentTimeMillis(); System.out.println(sb.toString() + "buffer cost:" + (endtime - starttime) + " millis"); } /** * 測試StringBuilder迭代賦值結(jié)果 * * @param mlist */ public static void doStringBuilderListTest(List mlist) { StringBuilder sb = new StringBuilder(); long starttime = System.currentTimeMillis(); for (Iterator iterator = mlist.iterator(); iterator.hasNext();) { sb.append(iterator.next()); } long endtime = System.currentTimeMillis(); System.out.println(sb.toString() + "builder cost:" + (endtime - starttime) + " millis"); } public static void main(String[] args) { doStringTest(); doStringBufferTest(); doStringBuilderTest(); List list = new ArrayList (); list.add(" I "); list.add(" like "); list.add(" BeiJing "); list.add(" tian "); list.add(" an "); list.add(" men "); list.add(" . "); doStringBufferListTest(list); doStringBuilderListTest(list); } }
看一下執(zhí)行結(jié)果:
2711 millis has costed when used String. 211 millis has costed when used StringBuffer. 141 millis has costed when used StringBuilder. I like BeiJing tian an men . buffer cost:1 millis I like BeiJing tian an men . builder cost:0 millis
從上面的結(jié)果可以看出,不考慮多線程,采用String對象時(我把Count/100),執(zhí)行時間比其他兩個都要高,而采用StringBuffer對象和采用StringBuilder對象的差別也比較明顯。由此可見,如果我們的程序是在單線程下運(yùn)行,或者是不必考慮到線程同步問題,我們應(yīng)該優(yōu)先使用StringBuilder類;如果要保證線程安全,自然是StringBuffer。
從后面List的測試結(jié)果可以看出,除了對多線程的支持不一樣外,這兩個類的使用方式和結(jié)果幾乎沒有任何差別。
關(guān)于stringbuffer和stringbuilder有什么區(qū)別問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。