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