一、String
String屬於字符串常量,每次+=操作時其實都會創建一個新對象返回,原對象不會發生任何改變,因此在大量字符串拼接的場景中使用String類型會導致對象爆炸。
字符串不可變的優點:便於字符串共享
字符串存儲在公共的常量池中,當將某個字符串數據copy一份時,由於是不可變的,即該塊內存地址中的數據時不會發改變的,那麼基於不可變性我們不需要再新申請一份地址存儲相同的數據,我們只需要要將引用變量指向原來的那塊內存地址即可。試想如果String是可變的,那麼我們拷貝多份某個字符串後,由於他們均共享同一塊內存,那麼通過其中某一個變量的地址對數據盡心了修改,那麼其他的變量在渾然不知的情況下也發生了變化,那麼這種場景肯定是需要避免的。
二、StringBuilder
StringBuilder屬於字符串變量,非線程安全,在大量字符串場景下並且不要求線程安全時可以使用StringBuilder。從append源碼我們可以看出每次字符串拼接返回的均是this.
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
三、StringBuffer
StringBuffer也屬於字符串變量,其實對StringBuilder的封裝,唯一不同的是StringBuffer的所有方法上加了synchronized關鍵字來保證線程安全。append源碼舉例如下:
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}