StringBuffer的構造器
StringBuffer共有4中構造器,這里博主只講3種
1.StringBuffer sb1=new StringBuffer();
這里看似沒有傳入參數,其實StringBuffer會默認傳入16進入抽象父類的構造器。看源碼:
public StringBuffer() {
? ? ? ? ? ?super(16);
}
這里插一個話題:java中的字符串關系圖
AbstractStringBuilder會開辟16個空間長度的char類型,并將值賦值給value(其內部的一個屬性,其實是一個char數組)。看源碼:
AbstractStringBuilder(int capacity) {
? ? ? ? ?value = new char[capacity];
}
2.StringBuffer sb2=new StringBuffer(int)
這個構造器可以自行初始化長度
3.StringBuffer sb3=new StringBuffer(String str)
這個構造器開辟的char數組長度是默認的長度16+str.length()
之后將str的值append到數組中
StringBuffer的append方法
1.實際的執(zhí)行由父抽象類AbstractStringBuilder完成
2.會進入父類的ensureCapacityInternal方法,判斷當前的char數組空間是否夠用,不夠則進行擴展,長度變?yōu)?原來的數組長度+1)*2。看源碼:
3.最終由System.arraycopy執(zhí)行(本地c語言代碼),修飾符是native,Arrays.copy只是一個過渡。看源碼:
original:被復制的字符串,即append(str)中的str
0:被復制字符串的起始復制下標
copy:存儲復制的字符串,即將original復制到copy中
0:copy的復制起始下標
第四個參數:copy復制結束的下標
StringBuffer的append方法雖然很多,但是無外乎這個執(zhí)行順序,遺憾的是System.arraycopy是由c/c++語言函數執(zhí)行的,java并沒有開放,所以看不到。
StringBuffer的insert方法
1.實際的執(zhí)行還是由父類AbstractStringBuilder完成
2.前面走的路和append一樣,也要去判斷空間是否夠用。
3.舉個具體的例子:
StringBuffer sb=new StringBuffer("123456");
sb.insert(4,'a');
4.最終的執(zhí)行還是System.arraycopy,看源碼:
將參數換成具體的值就是:
System.arraycopy("123456",4,"123456",5,2);
將第一個“123456”的下標4開始復制,賦值給第二個“123456”從下標5開始的之后2位,然后返回第二個字符串,結果是“1234556”。
insert和append一樣重載比較多,但是套路一樣。