首頁 Java java教程 stringbuffer和stringbuilder的差別

stringbuffer和stringbuilder的差別

Jun 04, 2019 pm 01:19 PM
stringbuffer

無論是做Java或Android,都避免不了遇到這個問題,其實開發過程中一般情況下是不會糾結,這個問題是面試必選經典題,今天有時間,就總結一下。

stringbuffer和stringbuilder的差別

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

在Java中,我們如何比較StringBuilder和StringBuffer? 在Java中,我們如何比較StringBuilder和StringBuffer? Aug 28, 2023 pm 03:57 PM

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

使用StringBuffer類別的toString()方法將StringBuffer轉換為字串 使用StringBuffer類別的toString()方法將StringBuffer轉換為字串 Jul 25, 2023 pm 06:45 PM

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

使用StringBuffer類別的reverse()方法反轉字串 使用StringBuffer類別的reverse()方法反轉字串 Jul 24, 2023 pm 04:41 PM

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

如何在Java中使用String類別、StringBuffer和StringBuilder? 如何在Java中使用String類別、StringBuffer和StringBuilder? Apr 21, 2023 pm 07:22 PM

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

使用StringBuffer類別的substring()方法取得字串部分內容的子字串 使用StringBuffer類別的substring()方法取得字串部分內容的子字串 Jul 24, 2023 pm 12:41 PM

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

Java中StringBuffer和StringBuilder怎麼使用 Java中StringBuffer和StringBuilder怎麼使用 Jun 02, 2023 pm 03:01 PM

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

使用StringBuffer類別的insert()方法在Java中向字串中插入內容 使用StringBuffer類別的insert()方法在Java中向字串中插入內容 Jul 24, 2023 am 11:34 AM

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

使用StringBuffer類別的reverse()方法反轉字串中的字元順序 使用StringBuffer類別的reverse()方法反轉字串中的字元順序 Jul 26, 2023 pm 10:10 PM

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

See all articles