1. 程式人生 > >Java中 String類、StringBuilder類、StringBuffer類 區別與如何選擇

Java中 String類、StringBuilder類、StringBuffer類 區別與如何選擇

1. 概述:

        1.1 String

                  字串常量,但是它具有不可變性,就是一旦建立,對它進行的任何修改操作都會建立一個新的字串物件。

        1.2 StringBuffer

                  字串可變數,是執行緒安全的,和StringBuilder類提供的方法完全相同。如果檢視java的原始碼(即java安裝目錄的src.zip檔案),就會發現它和StringBuilder類的方法的區別就是,在每個方法前面添加了"synchronized",保證其是執行緒安全的。

        1.3 StringBuilder

                  字串可變數,是執行緒不安全的。在java API中指明:這個類是在JDK 5才開始加入的,是StringBuffer的單執行緒等價類。(其他兩個String和StringBuffer類,都是JDK 1.0開始)

2. 主要方法:

        java API提供了處理字串的絕大多數方法,所以我們在寫程式的時候如果需要處理字串,一定要先查詢API,查查是不是已經提供了相應的方法。個人認為這是考察一個程式設計師是否合格的一個初級標準。

        2.1 String

                  檢查序列的單個字元、比較字串、搜尋字串、提取子字串、建立字串副本並將所有字元全部轉換為大寫或小寫等等。具體的方法歸類請檢視:

《Java中的String的 方法歸類 及其 不可變性》

        2.2 StringBuffer

                  與String類提供的方法大同小異,有些只是名稱的小小區別。由於StringBuffer類主要用來處理經常變動的字串,所以用的最多的方法是appendinsertdelete方法,java API 已經過載append和insert方法,從而支援對幾乎所有基本資料型別的操作。方法詳細介紹參見java API

        2.3 StringBuilder

                  提供的方法與StringBuilder類完全相同,只是每個方法前都添加了synchronized關鍵字來保證執行緒的同步。但是由於StringBuilder不執行同步操作,所以速度更快

。下面有三者的效率測試比較。

3. 試驗程式碼:

         3.1 驗證String的常量性(不可變性)

         3.2 比較String、StringBuilder、StringBuffer 的效率比較

        程式碼如下:

public class Test {
	int loopCount = 10000; // 執行新增操作10000次

	public static void main(String[] args) {
		Test test = new Test();
		test.testString();
		test.testStringBuffer();
		test.testStringBuilder();
	}

	private void testString() {
		long startTime = System.nanoTime();// 獲得當前系統最準確的計時器,以毫微秒為計時單位
		String temp = "";
		for (int i = 0; i < loopCount; i++) {
			temp += i;
		}
		long endTime = System.nanoTime();
		System.out.println("String執行時間: " + (endTime - startTime));
	}

	private void testStringBuffer() {
		long startTime = System.nanoTime();// 獲得當前系統最準確的計時器,以毫微秒為計時單位
		StringBuffer temp = new StringBuffer("");
		for (int i = 0; i < loopCount; i++) {
			temp.append(i);
		}
		long endTime = System.nanoTime();
		System.out.println("StringBuffer執行時間: " + (endTime - startTime));
	}

	private void testStringBuilder() {
		long startTime = System.nanoTime();// 獲得當前系統最準確的計時器,以毫微秒為計時單位
		StringBuilder temp = new StringBuilder("");
		for (int i = 0; i < loopCount; i++) {
			temp.append(i);
		}
		long endTime = System.nanoTime();
		System.out.println("StringBuilder執行時間: " + (endTime - startTime));
	}
}

      執行結果:

String執行時間: 493039735
StringBuffer執行時間: 1543976
StringBuilder執行時間: 882139

     結果分析:由於String類是不可變的,每次對其改變都要建立新字串物件,所以它是最慢的; StringBuilder不需要執行同步操作,速度要比StringBuffer快。即執行修改操作的速度從高到低為:StringBuilder>StringBuffer>String

4. 如何選擇

        到這裡,它們之間的區別我們應該已經明白了,這裡畫蛇添足一下在程式設計的時候到底應該如何選擇。

        總結區分的原因:String是字串常量,一旦建立就不能修改;StringBuffer和StringBuilder是字串可變數,可以修改,但是StringBuffer是執行緒安全的,StringBuilder是執行緒不安全的。

        選擇方法
              如果很少修改,使用String,畢竟它最簡單;
              如果經常修改,且是執行緒,使用StringBuilder;(實際上,StringBuilder是我們最常用的,因為我們經常需要修改字串,並且我們的程式多是單執行緒的)
              如果經常修改,且是執行緒,使用StringBuffer。