1. 程式人生 > >StringBuffer和StringBuilder原始碼解析(一)--構造方法

StringBuffer和StringBuilder原始碼解析(一)--構造方法

前幾天接到阿里巴巴的電話面試,被虐的一塌糊塗。當時問我列印字串可以用這種方式System.out.println(“a” + “b” + “c”),但是一般我們不用這種方式,而要用StringBuffer,這是為什麼?我說String內部存放字串的資料結構是char型陣列,這個char型陣列是final型的,一旦被定義就不能被修改,所以這種方式列印字串要new三次物件,而且物件在常量池也是一直存在的,這樣很浪費空間。而StringBuffer內部也是一個char型陣列,這個char型陣列沒有被final修飾,可以直接把字串新增進去。他又問我怎麼新增的?我就蒙了,沒有具體看,今天看了原始碼,才發現自己當時真的是胡說八道。所以今天專門抽出時間看看StringBuffer的原始碼,並對原始碼進行解析。

StringBuffer類和StringBuilder類

public final classStringBuffer(StringBuilder)

extends AbstractStringBuilder

implementsjava.io.Serializable, CharSequence

1. 這個類final型別的,不能被繼承,不能被修改;

2. 繼承了AbstractStringBuilder抽象類,這個抽象類中提供了很多方法,檢視原始碼可以看到StringBuffer中的方法基本上都呼叫了這個類中的方法。為什麼要寫這個抽象類作為父類呢?我認為這個抽象類主要是為StringBuffer和StringBuilder提供公共的方法,因為StringBuilder是執行緒不安全的,直接呼叫了父類的方法,而StringBuffer中每個方法都加了synchronized,保證了執行緒安全,其他全部一樣。

3. 實現java.io.Serializable,讓當前類可以被序列化。

4. 實現了CharSequence介面,這個介面其實是String的父類,也就是說String類也實現了這個介面,提供了四個方法。我們再遇到他的時候,可以當做String型別。

1.初始化方法。

   publicStringBuffer()

   publicStringBuffer(int capacity)

   publicStringBuffer(String str)

   publicStringBuffer(CharSequence seq)

四個構造方法的特點:

1.這四個方法內部都呼叫了父類的有參構造方法

AbstractStringBuilder(intcapacity){};

2.提供的引數 capacity  =  實際長度 +  16。比如StringBuffer()的長度是16,,

StringBuffer(int capacity)的長度是capacity = capacity + 16….

3.在父類方法中初始化了char型陣列。

特別之處:

publicStringBuffer(String str)

publicStringBuffer(CharSequence seq)

這兩個方法在初始完陣列之後,把引數新增到了陣列中,也就是初始化了陣列的值,至於怎麼新增的請看append(…)方法。