其實在上面的文章中我已經闡述過了什麼是string,其實,string三姐妹中還有兩個非常豐滿的存在:stringbuffer老大姐和stringbuilder小妹妹.
首先,前面我們說過string是不能被修改的,無論你如何對string進行指派(+)都會在字元串常連池裡面生成一個值.并且把這個值得位址引用給string變量,是以,隻要是玩string後面添加東西,都是建立一個全新的javastring對象.這樣,我們可以來做個實驗:
//本來
一開始是想計算五百次的string添加計算的,kanla9ishi天真了,那麼五萬次呢....
輸出:
string 總共耗時為: 6秒
現在來看stringbuffderder的情況:注意時間機關
stringbuffer 總共耗時為: 308毫秒
然後...
.stringbudiler: 總共耗時為: 240毫秒
大家可以很明顯的看出來了是怎麼一回事.string循環五萬次,了6000毫秒,而stringbuffer循環添加五百萬個隻用了300毫秒!!!當然stringbuilder隻用了200毫秒.我的天,這是什麼情況?
其實,為什麼string三姐妹這件的差距這麼的,就在于我開篇所說的,對于string來說,沒錯往已有的字元串後面追加内容,都是一個新的對對象,是對象就需要去給他開辟記憶體等等一些列複雜的炒作,但是,記住,但是@@@stringbuffer和stringbudiler在已有的字元串後面追加,其實是在修應該這個已經存在了的string對象,而沒有建立新的對象!這既是為什麼有這麼大差距的原因了..是的,就是這樣的....
那麼...下一個問題.為什麼會有兩個高速修改字元類型的類?stringbuffer和stringbudiler?
其實從上面的資料也可以看出一點,stringbuffer的速度沒有strinhbuilder的速度快的,這是因為,stringbuffer是一個線程安全的類,你可以從他的源代碼看到他的所有方法第都添加了synchronized關鍵字來保證線程安全.而stringbuild沒有這種限制.如何選擇就得看你的業務覺得了.
最後一個問題.stringbuffer和stringbudiler還有提升速度的空間嗎?
答案是有的.通過分析源代碼我們可以看到一個非常現實的東西,那就是,sb們都有一個初始的容量.其值為16
stringbuffer的初始容量: 16
stringbuilder的初始容量: 16
容量是什麼?容量就是這個sb能裝多少的内容!這枚了解沒毛病的
stringbuffer的現有容量: 19
stringbuilder的現有容量: 19
以此可以看出,容量是可以改變的,那麼他是在什麼時候去改變你的呢?
看源代碼:
添加long新類型時:
public abstractstringbuilder append(int i) {
}
class stringbuffertest2{
class stringbudilertest2{