String 與StringBuffer,StringBuilder的區別

String
Java中的String對象是final的,即 String 對象被創建之後就無法再對其進行修改。也就是說,儘管 String 類提供了替換(replace)、截取子串(subString)等方法,但這些方法都不是直接對原始的 String 對象進行操作,其操作結果會生成一個全新的字符串對象。當我們使用 + 來連接兩個 String 對象的時候,該操作同樣是創建出一個全新的字符串對象。

示例代碼:

String str = "aaabbbcccddd";
String newStr = str.replace('a', 'A');
System.out.println(newStr);
說明:
替換之後的結果是生成了一個全新的字符串對象:newStr 。

StringBuffer
StringBuffer類是對String類的一個補充,它用來表示內容可變的字符串,並提供了修改底層字符串的方法。StringBuffer類從 JDK 1.0 就已經提供。

該類是線程安全的。

示例代碼:

StringBuffer sb = new StringBuffer("aaabbbcccddd");
sb.replace(0, 3, "AAA");
System.out.println(sb.toString());
說明:
直接在 StringBuffer對象上進行操作。

API文檔鏈接:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuffer.html

StringBuilder
我們可以將 StringBuilder 類看做是對 StringBuffer 的進一步補充。StringBuilder 類也表示內容可變的字符串,並且該類與 StringBuffer 有着相同的操作界面,唯一的區別就是 StringBuilder 類不是線程安全的。

JDK 1.5 開始提供 StringBuilder 類。

API文檔鏈接:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html

效率的比較:

String str = "";
long beginTime = System.currentTimeMillis();

for (int i = 0; i < 999999; i++){
str = str + i;
}

long endTime = System.currentTimeMillis();

System.out.println("執行時間:" + (endTime - beginTime));
運行時間太長了,沒有等到程序運行結束就被我直接終止了。

StringBuffer buffer = new StringBuffer("");
long beginTime = System.currentTimeMillis();
for (int i = 0; i < 999999; i++){
buffer.append(i);
}
long endTime = System.currentTimeMillis();
System.out.println("執行時間:" + (endTime - beginTime));
輸出:

執行時間:250
StringBuilder builder = new StringBuilder("");
long beginTime = System.currentTimeMillis();
for (int i = 0; i < 99999; i++){
builder.append(i);
}
long endTime = System.currentTimeMillis();
System.out.println("執行時間:" + (endTime - beginTime));
輸出:

執行時間:188
在數量級相對較小的時候,StringBuffer和StringBuilder的區別不大,只有當數量級相對較大的時候才能體會到他們兩個之間的效率差別。

StringBuffer爲了做到線程安全,犧牲一定的效率是必然的。

在java中,String + StringBuffer + StringBuilder 基本涵蓋了java字符串操作的所有方面,掌握好這三個工具類,基本的字符串處理可以無憂了。

原文出處:http://www.darkmi.com/blog/archives/1403

總結:String用於字符不需要做更改時,而使用+號,連接兩個字符,效率比較低,其低層實現原理是,String str ="this is string";
StringBuffer tem = new StringBuffer(str);
tmp.append("second string");
str = tmp.toString();

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 7216
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章