String,StringBuffer,StringBuilder之間的關係
今天我們說說 String-----StringBuffer----- StringBuilder之間的關係
首先熟悉一下三個類:
String: 適用於字串少量修改
StringBuffer: 多執行緒頻繁修改字串
StringBuilder:單執行緒頻繁修改字串
String,StringBuffer,StringBuilder的異同
共同點:
1 都屬於java.lang包
2 可以互相轉換,大都用於字串的修改
不同點:
1.String: 原始碼中以長度為"傳入字串長度"的char型別陣列進行儲存,jdk1.9 起以byte型別陣列儲存引數(傳入英文時byte型別比char型別要節省1位元組
StringBuilder,StringBuffer: 原始碼以長度為"傳入字串長度"+16 固定長度的char型別陣列進行儲存。//看原始碼
2.String類是不可變的 (傳入的字串用帶有final關鍵字修飾char型別陣列儲存,無法被修改) //看原始碼
StringBuilder,StringBuffer:具有可變性,傳入的字串無final關鍵字修飾,可修改。(原始碼用System.arraycopy()方法對char陣列
長度不足的情況下可以進行擴容) //看原始碼
3 當頻繁處理字串時,StringBuffer,StringBuilder比String更能
注:上述的異同點要是不懂的可以瞅一下原始碼喲~~
StringBuffer和StringBuilder的不同點
1.執行緒安全:
StringBuffer類 (jdk1.0版本):適用於多執行緒,方法利用synchronized同步鎖,犧牲效能換安全
StringBuilder類(jdk1.5版本):適用於單執行緒,沒有給方法施加synchronized同步鎖,犧牲了安全換效能
2.效能:
StringBuffer:執行緒安全,效能較差,開銷大
StringBuilder:執行緒不安全,效能較好,開銷小
相同條件下,使用StringBuilder,比使用StringBuffer能獲得10%~15%左右
補充一點:
String型別若是在字元常量池進行拼接操作,切記不能利用變數拼接,由於變數的建立在堆中開闢,導致比較的記憶體地址會出錯
String str1="AABB";
String str2="AA";
String result="AA"+"BB";
String result1=str2+"BB"; //str2為變數
System.out.println(result==result1);
結果為:
總結:
1.String型別具有不可變,StringBuffer和StringBuilder 有可變性
2.String處理少量字串,StringBuffer和StringBuilder 頻繁處理字串
3.StringBuffer:犧牲效能換安全;StringBuilder:犧牲安全換效能
4.StringBuffer:多執行緒 ;StringBuilder:單執行緒