關于StringBuffer的理解

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一樣重載比較多,但是套路一樣。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,525評論 0 3
  • 文/晴天 是否 我們在黑夜里 才更渴望光明 為什么? 不在光明里 珍惜?
    草原風的追逐者閱讀 160評論 0 1
  • 其實人生有什么意義? 最愛我的人已經不在了 我只是想需要愛 而你們卻以為我是個很物質的人 盡管從小到大都缺乏物質 ...
    子衿凌閱讀 297評論 0 0
  • 有一位年輕人,看到單一垂直品類小黑裙女裝這個藍海。拋開其他電商渠道,只在公眾號上銷售,1年做到從0-700萬粉絲,...
    走在路上走閱讀 1,115評論 0 2