java—StringBuffer和StringBuilder
阿新 • • 發佈:2020-12-14
1. String、StringBuffer、StringBuilder三者的異同?
- String:不可變的字元序列;底層使用char[]儲存
- StringBuffer:可變的字元序列;執行緒安全的,效率低 (因為使用了synchronized) ;底層使用char[]儲存
- StringBuilder:可變的字元序列;jdk5.0新增的,執行緒不安全的,效率高;底層使用char[]儲存
2. StringBuffer類:
其可變的字元序列體現在:
- 例如下面示例,對於String,因為儲存在final的char[]中,具有不可變性。其常用方法都是直接返回一個新的String物件,原本的物件不會改變。
- 但是StringBuffer型別的物件,其setCharAt()方法是void的,直接可以在原儲存區域更改該物件某個位置的值。
- 注意宣告StringBuffer型別的物件時不能用 StringBuffer sb = "abc"; 這是對於String型別可以使用的,從而儲存在常量池中。
package day3; public class stringtest1 { public static void main(String[] args){ StringBuffer sb = new StringBuffer("abc"); sb.setCharAt(0, 'A'); System.out.println(sb);//Abc String s = "abc"; String s1 = s.replace('a','A'); System.out.println(s);//abc System.out.println(s1);//Abc } }
3. String和StringBuffer和StringBuilder區別的原始碼分析
- String str = new String(); 原始碼中:char[] str = new char[0];
- String str= new String("abc"); 原始碼中:char[] str = new char[]{'a','b','c'};
- String str= "abc"; 原始碼中:final char[] str = new char[]{'a','b','c'};
- StringBuffer str = new StringBuffer(); 原始碼中:char[] str = new char[16]; 建立了長度為16的char[]。如果容量不夠用就擴容。
- StringBuffer str = new StringBuffer("abc"); 原始碼中:char[] str = new char[16+str.length()]; 建立了長度為19的char[]。相當於多擴容了16個位置。
- 對於StringBuffer的 str,雖然建立時都多擴容了16個位置,但是str.length()還是實際長度
- 對於StringBuffer str = new StringBuffer(); 這種構造方式,因為一開始預設建立16個容量的char[],再之後新增元素的時候如果超出容量,要重新建立一個長度等於原來容量的2倍 + 2的char[],再把原來的陣列複製到新陣列中。我們推薦利用StringBuffer str = new StringBuffer(int capacity); StringBuiler str = new StringBuiler(int capacity);這種構造方式,避免複製等操作。
- StringBuffer和StringBuilder在上面原始碼是一樣的,都是可變的。
4. StringBuffer和StringBuiler的常用方法:(StringBuffer和StringBuiler的常用方法一樣,只介紹StringBuffer)
注意void型別的方法都是直接對原字串進行修改,有返回值的就是沒修改原來的字串,而是返回一個新的字串
StringBuffer append(xxx):提供了很多的append()方法,用於進行字串拼接 StringBuffer delete(int start,int end):刪除指定位置的內容,左閉右開 StringBuffer replace(int start, int end, String str):把[start,end)位置替換為str StringBuffer insert(int offset, xxx):在指定位置前插入xxx,xxx支援多種基本資料型別轉化為string StringBuffer reverse() :把當前字元序列逆轉 public int indexOf(String str) 返回str在原字串中出現的位置 public String substring(int start,int end):返回一個從start開始到end索引結束的左閉右開區間的子字串 public int length() public char charAt(int n ) public void setCharAt(int n ,char ch) 總結: 增:append(xxx) 刪:delete(int start,int end) 改:setCharAt(int n ,char ch) / replace(int start, int end, String str) 查:charAt(int n ) 插:insert(int offset, xxx) 長度:length();
示例:對於StringBuffer s = new StringBuffer("hello");
- 自動將基本資料型別轉成string後增加到最後。
- s1.append(1); //hello1
- s1.append('1');//hello1
- s1.append(false);//hellofalse
- s1.append(11.01);//hello11.01
- s1.delete(2,4); //heo 左閉右開
- s1.replace(2,4,"aa");// heaao
- s1.insert(1,1); // h1ello
- s1.reverse(); // olleh
5. String和StringBuffer和StringBuilder的效率
對比String、StringBuffer、StringBuilder三者的效率:“注意這裡string是用字面量的方式建立” 從高到低排列:StringBuilder > StringBuffer > String
String最低的原因是不可變,所以每次操作都是需要重新在常量池裡建立。