StringBuffer、StringBuilder

 一、初始化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

  1. public static void main(String[] args) throws Exception {  
  2.         String string = "0";  
  3.         int n = 10000;  
  4.         long begin = System.currentTimeMillis();  
  5.         for (int i = 1; i < n; i++) {  
  6.             string += i;  
  7.         }  
  8.         long end = System.currentTimeMillis();  
  9.         long between = end - begin;  
  10.         System.out.println("使用String類耗時:" + between+"ms");  
  11.   
  12.         int n1 = 10000;  
  13.         StringBuffer sb = new StringBuffer("0");  
  14.         long begin1 = System.currentTimeMillis();  
  15.         for (int j = 1; j < n1; j++) {  
  16.             sb.append(j);  
  17.         }  
  18.         long end1 = System.currentTimeMillis();  
  19.         long between1 = end1 - begin1;  
  20.         System.out.println("使用StringBuffer類耗時:" + between1+"ms");  
  21.   
  22.         int n2 = 10000;  
  23.         StringBuilder sb2 = new StringBuilder("0");  
  24.         long begin2 = System.currentTimeMillis();  
  25.         for (int k = 1; k < n2; k++) {  
  26.             sb2.append(k);  
  27.         }  
  28.         long end2 = System.currentTimeMillis();  
  29.         long between2 = end2 - begin2;  
  30.         System.out.println("使用StringBuilder類耗時:" + between2+"ms");  
  31.     }  

 

 

 

 

 

 

輸出:字符串

使用String類耗時:982ms
使用StringBuffer類耗時:2ms
使用StringBuilder類耗時:1ms

雖然這個數字每次執行都不同,並且每一個機子的狀況也不同,可是有幾點是肯定的,String類消耗的明顯比另外兩個多得多。還有一點就是,StringBuffer要比StringBuilder消耗的多,儘管相差不明顯。

接下來介紹一些經常使用的方法。

-----------------------public synchronized int length()--------------------------

-------------------------public synchronized int capacity()---------------------------

兩者都是獲取字符串的長度,length()獲取的是當前字符串的長度,capacity()獲取的是當前緩衝區的大小。舉個簡單的例子:

 

  1. StringBuffer sb = new StringBuffer();  
  2.         System.out.println(sb.length());;  
  3.         System.out.println(sb.capacity());  

輸出:

 

 

 

 

 

 

0

16

 

  1. StringBuffer sb = new StringBuffer("hello");  
  2.         System.out.println(sb.length());;  
  3.         System.out.println(sb.capacity());  

輸出:

 

 

 

 

 

 

5

21

由於默認分配16個字符大小的空間,因此不難解釋上面的結果。

------------------public boolean equals(Object paramObject)---------------------

 

  1. StringBuffer sb = new StringBuffer("hello");  
  2.         StringBuffer sb2 = new StringBuffer("hello");  
  3.         System.out.println(sb.equals(sb2));  

以上程序輸出false,是否是有點驚訝?記得以前咱們的文章說過,equals()比較的是字符串的內容,按理說此處應該輸出的是true纔對。

 

 

 

 

 

 

究其緣由,String類重寫了Object的equals(),因此只須要看內容是否相等便可,可是StringBuffer沒有重寫equals(),此處的equals()仍然是調用的Object類的,因此,調用StringBuffer類的equals(),只有地址和內容都相等的字符串,結果纔會返回true。

另外StringBuffer有一系列追加、插入、刪除字符串的方法,首先append(),就是在原來的字符串後面直接追加一個新的串,和String類相比有明顯的好處:

String類在追加的時候,源字符串不變(這就是爲何說String是不可變的字符串類型),和新串鏈接後,從新開闢一個內存。這樣就會形成每次鏈接一個新串後,都會讓以前的串報廢,所以也形成了不可避免的內存泄露。

 

  1.              //append()  
  2. StringBuffer sb = new StringBuffer("helloworld, ");  
  3. sb.append("I'm ").append("erqing ").append("who ").append("are you ?");  
  4. System.out.println(sb);  
  5. //public synchronized StringBuffer insert(int paramInt, Object paramObject)  
  6. sb.insert(12, /*9*/"nice! ");  
  7. System.out.println(sb);  
  8. //public synchronized StringBuffer reverse()  
  9. sb.reverse();  
  10. System.out.println(sb);  
  11. sb.reverse();  
  12. System.out.println(sb);  
  13. //public synchronized StringBuffer delete(int paramInt1, int paramInt2)  
  14. //public synchronized StringBuffer deleteCharAt(int paramInt)  
  15. sb.delete(12, 18);  
  16. System.out.println(sb);  
  17. sb.deleteCharAt(5);  
  18. System.out.println(sb);  

輸出:

 

 

 

 

 

 

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()---------------------

該方法用於將多餘的緩衝區空間釋放出來。

 

  1.               StringBuffer sb = new StringBuffer("hello erqing");  
  2. System.out.println("length:"+sb.length());  
  3. System.out.println("capacity:"+sb.capacity());  
  4. sb.trimToSize();  
  5. System.out.println("trimTosize:"+sb.capacity());  

輸出:

 

 

 

 

 

 

length:12
capacity:28
trimTosize:12

StringBuffer類還有不少方法,關於字符查找,截取,替換方面的方法,有興趣的童鞋能夠去研究研究源碼,定會學到很多知識!

3、字符串處理類StringTokenizer

StringTokenizer是java.util包下的一個類,用來對字符串作簡單的處理。

舉個簡單的例子:

 

  1. String s = "Tonight is the answer !";  
  2.         StringTokenizer st = new StringTokenizer(s," ");  
  3.         int count = st.countTokens();  
  4.         System.out.println("個數爲:"+count);  
  5.         while (st.hasMoreTokens()) {  
  6.             String token = st.nextToken();  
  7.             System.out.println(token);  
  8.         }  

輸出:

 

 

 

 

 

 

個數爲:5 Tonight is the answer !

相關文章
相關標籤/搜索