相信大家看到過很多比較String和StringBuffer區別的文章,也明白這兩者的區別,然而自從Java 5.0發布以后,我們的比較列表上將多出一個對象了,這就是StringBuilder類。String類是不可變類,任何對String的改變都會引發新的String對象的生成;而StringBuffer則是可變類,任何對它所指代的字符串的改變都不會產生新的對象,可變和不可變類這一對對象已經齊全了,那么為什么還要引入新的StringBuilder類干嗎?相信大家都有此疑問,我也如此。下面,我們就來看看引入該類的原因。
為什么會出現那么多比較String和StringBuffer的文章?原因在于當改變字符串內容時,采用StringBuffer能獲得更好的性能。既然是為了獲得更好的性能,那么采用StringBuffer能夠獲得最好的性能嗎?答案是NO!為什么?如果你讀過《Think in Java》,而且對里面描述HashTable和HashMap區別的那部分章節比較熟悉的話,你一定也明白了原因所在。對,就是支持線程同步保證線程安全而導致性能下降的問題。HashTable是線程安全的,很多方法都是synchronized方法,而HashMap不是線程安全的,但其在單線程程序中的性能比HashTable要高。StringBuffer和StringBuilder類的區別也在于此,新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。如果你對此不太相信,可以試試下面的例子:



























































































































上面的程序結果如下:





從上面的結果來看,這三個類在單線程程序中的性能差別一目了然,采用String對象時,即使運行次數僅是采用其他對象的1/100,其執行時間仍然比其他對象高出25倍以上;而采用StringBuffer對象和采用StringBuilder對象的差別也比較明顯,前者是后者的1.5倍左右。由此可見,如果我們的程序是在單線程下運行,或者是不必考慮到線程同步問題,我們應該優先使用StringBuilder類;當然,如果要保證線程安全,自然非StringBuffer莫屬了。
除了對多線程的支持不一樣外,這兩個類的使用幾乎沒有任何差別,上面的例子就是個很好的說明。appendItemsToStringBuiler和appendItemsToStirngBuffer兩個方法除了采用的對象分別為StringBuilder和StringBuffer外,其他完全相同,而效果也完全相同。