String、StringBuffer、StringBuilder的比較
看String類的定義:public final class String...{private final char value[];}
看AbstractStringBuilder類的定義:abstract class AbstractStringBuilder...{char[] value;}
PS:StringBuffer類和StringBuilder類都繼承自AbstractStringBuilder類
我們不難發現:在String類中有一個char型別的陣列變數value,用final修飾說明大小不可變,用來存放String型別資料,實際字串底層就是用字元陣列來儲存的;而在AbstractStringBuilder類中也有一個char型別的陣列變數value,但是沒有任何修飾,表示大小可變。
直接上程式碼:
1 package com.bjwyj.method; 2 /** 3* 測試String、StringBuffer、StringBuilder的區別和聯絡 4* @author 吳永吉 5* 6*/ 7 public class TestString { 8public static void main(String[] args) { 9testString(); 10testStringBuffer(); 11testStringBuilder(); 12} 13 14/** 15* 測試String物件的追加 16*/ 17public static void testString() { 18String str = ""; 19long startTime = System.currentTimeMillis(); 20for(int i=0;i<10000;i++) { 21str += i; 22} 23long endTime = System.currentTimeMillis(); 24System.out.println(endTime-startTime); 25} 26 27/** 28* 測試StringBuffer物件的追加 29*/ 30public static void testStringBuffer() { 31StringBuffer sbuf = new StringBuffer(); 32long startTime = System.currentTimeMillis(); 33for(int i=0;i<10000;i++) { 34sbuf.append(i); 35} 36long endTime = System.currentTimeMillis(); 37System.out.println(endTime-startTime); 38} 39 40/** 41* 測試StringBuilder物件的追加 42*/ 43public static void testStringBuilder() { 44StringBuilder sbud = new StringBuilder(); 45long startTime = System.currentTimeMillis(); 46for(int i=0;i<10000;i++) { 47sbud.append(i); 48} 49long endTime = System.currentTimeMillis(); 50System.out.println(endTime-startTime); 51} 52 }
測試結果:
從測試結果可以看出:同樣是迴圈10000次的追加操作,結果卻大不相同。String類每次追加字串都會建立新的物件,消耗的時間最長,效能極差。而StringBuffer和StringBuilder每次追加字串都是同一個物件,消耗的時間極短,效能良好。而StringBuffer比StringBuilder消耗的時間稍長一點點,原因是StringBuffer是執行緒安全的,而StringBuilder是執行緒不安全的,所以StringBuffer相比StringBuilder效能稍差一點點。
總結:
(1)String類是不可變類,即一旦一個String物件被建立後,包含在這個物件中的字元序列是不可改變的,直至這個物件銷燬。
(2)StringBuffer類則代表一個字元序列可變的字串,可以通過append、insert、reverse、setCharAt、setLength等方法改變其內容。一旦生成了最終的字串,呼叫toString方法將其轉變為String。
(3)JDK1.5新增了一個StringBuilder類,與StringBuffer相似,構造方法和方法基本相同。不同是StringBuffer是執行緒安全的,而StringBuilder是執行緒不安全的,所以效能略高。通常情況下,建立一個內容可變的字串,應該優先考慮使用StringBuilder。