stringbuffer和stringbuilder的差別
無論是做Java或Android,都避免不了遇到這個問題,其實開發過程中一般情況下是不會糾結,這個問題是面試必選經典題,今天有時間,就總結一下。
StringBuffer、StringBuilder區別
StringBuffer與StringBuilder中的方法和功能完全是等價的,只是StringBuffer中的方法大都採用了synchronized關鍵字進行修飾,因此是線程安全的,支援並發操作,適合多執行緒使用。 StringBuilder不支援並發操作,線性不安全的,不適合在多執行緒中使用。新引入的StringBuilder類別不是線程安全的,但其在單線程中的效能比StringBuffer高。 (推薦學習:JAVA影片教學)
接下來,我直接貼上測試過程和結果的程式碼,一目了然:
public class StringTest { public static String BASEINFO = "Mr.Y"; public static final int COUNT = 2000000; /** * 执行一项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."); } /** * 执行一项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."); } /** * 执行一项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遍历赋值结果 * * @param mlist */ public static void doStringBufferListTest(List<String> mlist) { 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迭代赋值结果 * * @param mlist */ public static void doStringBuilderListTest(List<String> mlist) { StringBuilder sb = new StringBuilder(); long starttime = System.currentTimeMillis(); for (Iterator<String> 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<String> list = new ArrayList<String>(); list.add(" I "); list.add(" like "); list.add(" BeiJing "); list.add(" tian "); list.add(" an "); list.add(" men "); list.add(" . "); doStringBufferListTest(list); doStringBuilderListTest(list); } }
#看一下執行結果:
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
從上面的結果可以看出,不考慮多線程,採用String物件時(我把Count/100),執行時間比其他兩個都要高,而採用StringBuffer物件和採用StringBuilder物件的差異也比較明顯。由此可見,如果我們的程式是在單執行緒下運行,或是不必考慮到執行緒同步問題,我們應該優先使用StringBuilder類別;如果要保證執行緒安全,自然是StringBuffer。
從後面List的測試結果可以看出,除了對多執行緒的支援不一樣外,這兩個類別的使用方式和結果幾乎沒有任何差別。
更多JAVA相關技術文章,請造訪JAVA開發教學欄位進行學習!
以上是stringbuffer和stringbuilder的差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

StringBuffer物件通常可以安全地在多執行緒環境中使用,其中多個執行緒可能會嘗試存取同一個StringBuffer物件同時。 StringBuilder是線程安全的StringBuffer類別的替代品,它的工作速度要快得多,因為它沒有同步>方法。如果我們在單一執行緒中執行大量字串操作,則使用此類可以提高效能。範例publicclassCompareBuilderwithBufferTest{ publicstaticvoidmain(String[]a

使用StringBuffer類別的toString()方法將StringBuffer轉換為字串在Java中,StringBuffer類別是用於處理可變字串的類,它提供了許多方便的方法來修改和操作字串。當我們需要將一個StringBuffer物件轉換為字串時,可以使用toString()方法來實作。 StringBuffer類別的toString()方法回傳一

使用StringBuffer類別的reverse()方法來反轉字串在程式設計中,我們經常需要對字串進行一些操作,例如反轉字串。在Java中,可以使用StringBuffer類別的reverse()方法來實作字串反轉。下面讓我們一起來了解這個方法的使用。首先,我們需要建立一個StringBuffer對象,將要反轉的字串作為參數傳遞給它的建構函數,如下所示

String類別基本概念String類別屬於引用資料型別,不屬於基本資料型別。在Java中只要是""(雙引號)中的,都是String物件。 java中規定,雙引號中的字串是不可變的,也就是說"abc"自出生到死亡都不可能變成"abcd",也不能變成"ab"。在JDK中雙引號括起來的字串都是儲存在方法區的字串常數池當中的。 (因為在實際開發中,字串的使用頻率十分高,為了執行效率,就把字串放在了方法區中的字串常數池當

使用StringBuffer類別的substring()方法取得字串部分內容的子字串在Java程式設計中,經常需要對字串進行處理和操作。 StringBuffer類別是一個常用的字串類,它提供了一系列方便的方法來操作字串。其中,substring()方法是一個非常常用的方法,可以用來取得字串中的一部分內容,也就是子字串。以下將介紹如何使用StringBuffer類別的

當字串進行修改的時候,需要使用StringBuffer和StringBuilder類別。和String類別不同的是,StringBuffer和StringBuilder類別的物件能夠被多次的修改,並且不產生新的未使用物件。 StringBuffer:在使用StringBuffer類別時,每次都會對StringBuffer物件本身進行操作,而不是產生新的對象,所以如果需要對字串進行修改推薦使用StringBuffer。 StringBuilder:StringBuilder類別在Java5中被提出,它和S

使用StringBuffer類別的insert()方法在Java中向字串中插入內容在Java程式設計中,StringBuffer類別是一個非常常用的字串操作類別。它提供了多種方法來修改字串,其中insert()方法是一種非常方便用於向字串中插入內容的方法。 insert()方法的作用是在指定的位置插入一個字元、一個字元陣列、一個字串或其他資料類型轉換的字串

使用StringBuffer類別的reverse()方法反轉字串中的字元順序在Java中,有多種方法可以反轉字串中的字元順序。其中一個簡單而有效率的方法是使用StringBuffer類別的reverse()方法。本文將介紹如何使用這個方法來實現字串反轉,並提供相關的程式碼範例。 StringBuffer類別是Java中用於處理字串的可變類別。與String類別不同,
