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
檢查序列的單個字元、比較字串、搜尋字串、提取子字串、建立字串副本並將所有字元全部轉換為大寫或小寫等等。具體的方法歸類請檢視:
2.2 StringBuffer
與String類提供的方法大同小異,有些只是名稱的小小區別。由於StringBuffer類主要用來處理經常變動的字串,所以用的最多的方法是append、insert和delete方法,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。