最近和一位朋友在利用java做一個多語工具,他是java出身,而我是.net出身,最近剛開始搞java,發(fā)現(xiàn)他在處理字符串連接時使用的是StringBuffer,而我使用的是StringBuilder(.net中推薦的字符串連接的類,Java也有這個類,所以就用了),偶,“StringBuffer”是什么東東,它與StringBuilder有什么區(qū)別。
一、常量字符串連接
1、.net
例如
string str = "This is " + " a " + "test.";
編譯后,我們使用reflector反編譯一下,可以看到編譯器已經(jīng)給我們計算出了結果,避免了每次運行都重新計算,提供了效率。
string str="This is a test.";
例如2、Java
String str=“This is ”+" a "+"test.".
編譯后再反射,將得到類似下面的結果。
String abc=new StringBuilder("This is ").append(" a ").append("test.").
即每次運行時都要重新計算一下。
總結:從這點看.net關于常量字符串的處理要比java快,因為它在編譯時已進行了計算,運行時就是個常量。
二、StringBuilder和StringBuffer
1、.net中只有StringBuilder,沒有StringBuffer,且該類是非線程安全的。以下是msdn中關于StringBuilder在線程安全方面的描述
線程安全 此類型的任何公共靜態(tài)(Visual Basic 中的 Shared)成員都是線程安全的,但不保證所有實例成員都是線程安全的。
2、JAVA
StringBuffer 字符串變量(線程安全) StringBuilder 字符串變量(非線程安全)
兩者均繼承自AbstractStringBuilder,其內(nèi)部方法均是對其父類相應方法的調(diào)用,可以看作它們均是AbstractStringBuilder的包裝類,只不過一個是線程安全的包裝(StringBuffer),另一個是線程非安全的包裝(StringBuilder)。
StringBuffer的定義:
public final class StringBuffer
extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public StringBuffer() { super(16); } public StringBuffer(int capacity) { super(capacity); }
StringBuilder的定義
public final class StringBuilder
extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public StringBuilder() { super(16); } public StringBuilder(int capacity) { super(capacity); }
下面看一下兩者對append(String str)的處理
StringBuffer:
public synchronized StringBuffer append(String str) {
super.append(str); return this; }
StringBuilder:
public StringBuilder append(String str) {
super.append(str); return this; }
對比以上兩部分代碼,可以發(fā)現(xiàn)兩者代碼基本一樣,都是對父類相應方法的調(diào)用,不同的只是StringBuffer多了一個關鍵字synchronized,保證方法調(diào)用的原子性,即線程安全,這是要消耗系統(tǒng)資源的。
總結:多線程環(huán)境建議使用StringBuffer,它是線程安全的;單線程或者是多線程但是不存在多個線程同時操縱同一個StringBuilder實例的環(huán)境使用StringBuilder。