今天我們說說 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:單執行緒
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250671.html
標籤:java
上一篇:型別的轉換(Java)
下一篇:高級JAVA 臨考抱佛腳 自用
