1. 程式人生 > >StringBuffer和StringBuilder區別--證據篇

StringBuffer和StringBuilder區別--證據篇

這是個很倔強的問題,今天寫程式碼的時候,還在想用那個,乾脆具體區分以後再使用咯。
其實看下原始碼。
看個好玩的先,這倆東西首先在使用上是沒差別的,為什麼這麼說呢?看圖:
這裡寫圖片描述
這裡寫圖片描述

通過原始碼不難發現吧,StringBuffer的歲數更大一點兒,之所以說這倆在使用上沒有差別,你也能看到,繼承的抽象類和實現的介面一毛一樣。那麼問題來了,為啥要寫兩個一樣的類呢?我先劇透一下,是為了應用於不同的使用場景,年輕的StringBuilder,一定考慮了之前StringBuffer沒有考慮到的問題,所以才會如此。至於是啥問題,我們來看下圖:
這裡寫圖片描述
看到了吧,歲數大的StringBuffer這裡添加了一個一個的synchronized 關鍵字,這個關鍵字就厲害了,多執行緒訪問方法體或程式碼塊時,如果被這東西修飾的方法體和程式碼塊的話,就不能有非同步操作,也就是多個執行緒不能同時訪問了(這個關鍵字好像就是在說:向打架的排好隊,一個一個來)。我們再來看看年輕的 StringBuilder ,如下圖:
這裡寫圖片描述


全文檢索不到那個synchronized 關鍵字,所以,這個年輕的StringBuilder 當然支援一步操作了(Ps:他對所有執行緒說:別一個一個來了,向打架的,一起上吧。)


以上就是全部證據了。不過大家有沒有注意,為什麼JDK 開發團隊,不直接去在新的StringBuilder新增同步,卻在jdk1.5的時候,而是在老的裡面加呢?