Java中Spring,SpringBuffer和SpringBuilder的區別
1.String
String物件是不可變的。String類中每一個看起來會修改String值的方法(如upcase等),實際上都是建立了一個全新的String物件,以包含修改後的字串內容,而最初的String物件絲毫未動。
特殊點注意!
用於String的“+”和“+=”是Java中僅有的兩個過載過的操作符,他在字串相加的時候有特殊意義。先看下面這行程式碼
String heart = "i" + "love" + "you";
你覺得這行程式碼應該是怎麼工作的?
根據我們說的String物件是不可變的,是不是應該可能是這樣的,String建立了一個新的物件來接受“i”和“love”組合起來的新字串,然後再創個物件來接受“ilove”和“you”組成的新物件。可是如果是這樣的話,就會產生一堆需要GC(垃圾回收)的物件,這樣子的話效能肯定相當糟糕。可是呢,他並不是這樣子的(java設計師可能當時試過發現了這個問題)。當你使用“+”連線字串的時候,編譯器會自動引入java.lang.StringBuilder類。雖然我們在原始碼中並沒有使用StringBuilder類,但編譯器卻自作主張地使用了它,因為他更高效。編譯器會建立一個StringBuilder物件,併為每個字串呼叫一次append()方法,而StringBuilder是可變的,因此它在這個過程只建立了一個物件,是不是比原來的設計好多了。
這樣子是不是我們要操作字串的時候就可以完成信賴編譯器的優化了呢?再看看下面這段程式碼
String you = "you"
String me = "me"
for(int i = 0; i < 5; i++){
me += you;
}
仔細看,仔細看看,真的要仔細看看。
是不是每次進入迴圈都建立了一個StringBuilder物件。所以說,如果字串操作比較簡單,那就可以信賴編譯器的優化,但是如果要在迴圈中,那就最好自己建立一個StringBuilder物件,用StringBuilder的append等方法來操作。
2.StringBuilder
StringBuilder是可變的,它不是執行緒安全的。
3.StringBuffer
StringBuffer也是可變的,它是執行緒安全的,所以它的開銷比StringBuilder大。
一般我們這三個我們選用的順序是StringBuilder > StringBuffer > String