String、StringBuffer、StringBuilder探究

一、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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章