1. 程式人生 > 其它 >String,StringBuffer,StringBuilder之間的關係

String,StringBuffer,StringBuilder之間的關係

技術標籤:學習筆記java

今天我們說說 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:單執行緒