對String而言:
String是只讀字符串,所引用的字符串不能被改變,一經定義,無法再增刪改。
String 定義的字符串保存在常量池里面,進行+操作時不能直接在原有基礎上拼接。
每次+操作 : 隱式在堆上new了一個跟原字符串相同的StringBuilder對象,再調用append方法 拼接+后面的字符。
例如:
String str1="ss"; StringBuilder str2=new StringBuilder(ss);
str1=str1+"oo"; 等於 str2.append(oo);
(Java6和6之前,常量池是存放在方法區中的。
Java7,將常量池是存放到了堆中,常量池就相當於是在永久代中,所以永久代存放在堆中。
Java8之后,取消了整個永久代區域,取而代之的是元空間。沒有再對常量池進行調整。)
區別
String是只讀字符串,所引用的字符串不能被改變,Stringbuffer和Stringbuilder定義的可以通過各種方法來達到簡單的增刪改;
String和Stringbuilder在單線程環境下使用;
StringBuffer在多線程環境下使用,可以保證線程同步;
Stringbuilder 和StringBuffer 實現方法類似,均表示可變字符序列,不過StringBuffer 用synchronized關鍵字修飾(保證線程同步)
運行速度
當需要對某一字符串大量重復+操作時:
Stringbuilder 最快,不需要考慮線程同步;
StringBuffer次之;
String最慢,因為每次都要重新開辟內存,產生很多匿名對象,影響系統性能。
