String、StringBuild、StringBuffer
??String、StringBuild、StringBuffer在java中都是可以操作字串的物件,讓我們來看看它們之間的區別和聯系,
從結構分析
??從結構上來看,它們都是final類,并且都是用char陣列來存盤內容的,不過StringBuild、StringBuffer沒有用final和private來修飾這個陣列,
??StringBuild、StringBuffer都是繼承AbstractStringBuilder,但StringBuffer為了解決執行緒安全問題,在對應的方法加上了關鍵字,
從執行緒是否安全分析
??從執行緒安全方面來講,String是不可變的,所以是執行緒安全的,因為多個執行緒呼叫String的方法都會去產生一個新的String,不會改變最初的內容,(之前我總是認為String做拼接的時候,是執行緒不安全的,所以String是執行緒不安全的,其實他指的執行緒安全并不是這個意思,因為拼接已經不是原子操作了,它只是指Sring調String的方法不會發生執行緒安全問題,)
??StringBuild是非執行緒安全的,StringBuild也是用char陣列去存盤的,它其中某些方法是直接去操作這個陣列的,比如append方法所以在多執行緒情況下是不安全的,
??StringBuffer是執行緒安全的,雖然StringBuffer和StringBuild方法和屬性幾乎一樣、都是繼承AbstractStringBuilder,但是StringBuffer的方法有synchronize修飾,
String和StringBuild
??String物件用“+”去拼接時,其實是使用了StringBuild物件,`
public static void main(String[] args) {
String a="mihou";
String b="tao";
String c=a+b;
}
??上面是測驗代碼和對應的位元組碼,我們可以看到位元組碼中,先初始化了兩個String物件,然后再新建了一個StringBuild物件,再呼叫了StringBuild的append方法,將兩個String物件拼接進去,然后回傳StringBuild的toString,
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
??StringBuild的toString是回傳一個String物件,
??String c=“mihou”+“tao”,這個陳述句是沒有創建StringBuild物件的,因為前面我們講了必須是一個String物件使用了“+”,而“mihou”+“tao”其實只在常量池里面創建了“mihoutao”這一個物件,如果說“mihou”或者“tao”是String物件的話,就會創建StringBuild,那怎么去驗證沒有創建“mihou”物件呢?這里有兩種辦法,一種是去看位元組碼,

??這里我們可以看到只初始化了一個“mihoutao”,
??還有一種辦法是使用intern方法,jdk至少1.7,
public static void main(String[] args) {
String a="mihou"+"tao";
String b=new String("mi")+new String("hou");
System.out.println(b.intern()==b);
}
??這里輸出是true,剛好證明了常量池中沒有"mihou"物件,
從效率分析
??上面我們講了String在拼接時底層使用了Stringbuild,所以在這種拼接的時候效率是一樣的,不過在回圈中拼接就會回圈創建Stringbuild,這時效率就會低些,而用Stringbuild可以把物件創建在回圈外,避免這種情況,
??String中的方法,每次對產生新的物件,而Stringbuild是在原來的基礎上修改,所以String的開銷大些,
??Stringbuild和StringBuffer的差別在于StringBuffer要加鎖,釋放鎖,主要的開銷大小區別就在這里,所以Stringbuild的效率高,
??綜上所述,Stringbuild的效率總體來說是高于String和StringBuffer,String和StringBuffer的效率就要具體分析了,主要是看鎖消耗和頻繁創建物件哪個開銷大,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224189.html
標籤:其他
上一篇:SQL Server 局域網遠程連接 及花生殼公網遠程連接
下一篇:SQL注入基礎
