一、初始化java
StringBuffer和StringBuilder就是所謂的可變字符串類,共四個構造方法:安全
StringBuffer()app
public StringBuffer(int paramInt)性能
public StringBuffer(String paramString)ui
public StringBuffer(CharSequence paramCharSequence)線程
觀察其源碼發現,使用StringBuffer()時,默認開闢16個字符的長度的空間,使用public StringBuffer(int paramInt)時開闢指定大小的空間,使用public StringBuffer(String paramString)時,開闢paramString.length+16大小的空間。都是調用父類的構造器super()來開闢內存。這方面StringBuffer和StringBuilder都同樣,且都實現AbstractStringBuilder類。token
二、主要方法內存
兩者幾乎沒什麼區別,基本都是在調用父類的各個方法,一個重要的區別就是StringBuffer是線程安全的,內部的大多數方法前面都有關鍵字synchronized,這樣就會有必定的性能消耗,StringBuilder是非線程安全的,因此效率要高些。ci
輸出:字符串
使用String類耗時:982ms
使用StringBuffer類耗時:2ms
使用StringBuilder類耗時:1ms
雖然這個數字每次執行都不同,並且每一個機子的狀況也不同,可是有幾點是肯定的,String類消耗的明顯比另外兩個多得多。還有一點就是,StringBuffer要比StringBuilder消耗的多,儘管相差不明顯。
接下來介紹一些經常使用的方法。
-----------------------public synchronized int length()--------------------------
-------------------------public synchronized int capacity()---------------------------
兩者都是獲取字符串的長度,length()獲取的是當前字符串的長度,capacity()獲取的是當前緩衝區的大小。舉個簡單的例子:
輸出:
0
16
輸出:
5
21
由於默認分配16個字符大小的空間,因此不難解釋上面的結果。
------------------public boolean equals(Object paramObject)---------------------
以上程序輸出false,是否是有點驚訝?記得以前咱們的文章說過,equals()比較的是字符串的內容,按理說此處應該輸出的是true纔對。
究其緣由,String類重寫了Object的equals(),因此只須要看內容是否相等便可,可是StringBuffer沒有重寫equals(),此處的equals()仍然是調用的Object類的,因此,調用StringBuffer類的equals(),只有地址和內容都相等的字符串,結果纔會返回true。
另外StringBuffer有一系列追加、插入、刪除字符串的方法,首先append(),就是在原來的字符串後面直接追加一個新的串,和String類相比有明顯的好處:
String類在追加的時候,源字符串不變(這就是爲何說String是不可變的字符串類型),和新串鏈接後,從新開闢一個內存。這樣就會形成每次鏈接一個新串後,都會讓以前的串報廢,所以也形成了不可避免的內存泄露。
輸出:
helloworld, I'm erqing who are you ?
helloworld, nice! I'm erqing who are you ?
? uoy era ohw gniqre m'I !ecin ,dlrowolleh
helloworld, nice! I'm erqing who are you ?
helloworld, I'm erqing who are you ?
helloorld, I'm erqing who are you ?
-----------------public synchronized void trimToSize()---------------------
該方法用於將多餘的緩衝區空間釋放出來。
輸出:
length:12
capacity:28
trimTosize:12
StringBuffer類還有不少方法,關於字符查找,截取,替換方面的方法,有興趣的童鞋能夠去研究研究源碼,定會學到很多知識!
3、字符串處理類StringTokenizer
StringTokenizer是java.util包下的一個類,用來對字符串作簡單的處理。
舉個簡單的例子:
輸出:
個數爲:5 Tonight is the answer !