一、爲何須要StringBuilder類?html
由於String類型表明不可變字符串,因此沒法對當前String類型實例進行處理.因此FCL提供了System.Text.StringBuilder類型,它能夠接受字符串和字符做爲參數,並對其進行高效動態處理,最終返回String對象.so,你能夠將StringBuilder想象成對String字符串進行各類騷操做的特殊的構造器.經過Copy On Write技術實現的可變字符串的代理類,關於Copy On Wirte請參考Proxy代理模式(結構型模式)的案例二.數組
二、StringBuilder處理字符數組和字符串須知ide
(1)、StringBuilder對象實例包含一個字段,該字符引用了由Char字符構成的數組,能夠用StringBuilder的各個成員來操做該字符串數組.函數
(2)、高效率地縮短字符串或更改字符串中的字符.post
(3)、若是字符串變大,超過了事先分配的字符數組大小.StringBuilder會自動分配一個新的、更大的數組,複製字符.並開始使用新數組.前一個數組被垃圾回收.ui
(4)、當使用StringBuilder處理完目標字符串以後,能夠調用StringBuilder的ToString方法便可將StringBuilder的處理完的數組轉換成String.這樣就會在堆上新建String對象.以後能夠繼續處理StringBuidler中的字符串.之後可再次調用ToString把它轉換成另外一個字符串。url
常規的對字符串進行屢次處理:spa
string str = " Hello World"; //對string進行Trim()一去字符操做 //執行過程以下: //一、先從字符串的開頭開始處理,第一個是空格,檢索傳入的參數中是否有空格,有的話清除(若是第一個是連續的空字符,那麼全部的空格都清除) //若是第一個被清除掉了,那麼繼續下一個字母H,和上面同樣的流程.若是沒有被清除掉,那麼不在處理開頭,轉去清楚末尾的字母 //二、當開頭的字母處理完畢,接着開始處理末尾的,流程和開頭的一致 var res = str.Trim(' ', 'H','o'); //輸出:$ello World$ Console.WriteLine('$'+res+'$'); //能夠對上一步的處理結果進行處理,可是每次處理的都不是同一個實例 var res1 = res.Replace('o', 'a'); Console.WriteLine(res1); //能夠對上一步的處理結果進行處理,可是每次處理的都不是同一個實例 var res2 = res1.PadLeft(15, '-'); Console.WriteLine(res2);
雖然支持,可是每次處理的都不是同一個字符串對象實例,使用StringBuilder就能解決這個問題,保證進行屢次字符串操做的同時,還能確保操做的是同一個實例.3d
//設置當前StringBuilder的初始大小爲1,最大長度爲2. //若是設置了最大值,那麼超過最大值會拋異常,若是沒有設置最大值 //超過初始值,長度會自動擴大兩倍 StringBuilder sb = new StringBuilder(15,20); sb.Append(" Hello World"); sb.Replace('o', 'a'); Console.WriteLine(sb.ToString()); //輸出完上面的處理結果以後,你能夠繼續對原有的StringBuilder對象進行操做. sb.AppendFormat("{0}",1); Console.WriteLine(sb.ToString()); //注:全部的操做,操做的都是同一個對象,可能擴展事後的StringBuilder對象實例,會是新的對象實例
三、StringBuilder的基本知識點代理
(1)、StringBuilder不是基元類型,是引用類型,因此須要使用new來建立對象實例
(2)、StringBuilder類提供了6個構造器,裏面的關鍵參數有如下幾個
capacity一設置StringBuilder初始大小默認長度爲16.
maxCapacity一設置StringBuider的最大容量,默認值爲2147483647
value一字符串(字符串數組)
介紹一個不經常使用,可是有用的構造函數.
public StringBuilder(string value, int startIndex, int length, int capacity);
給定一個字符串數組,而後經過startIndex和length截取其中的一段字符串做爲字符數組,實例化一個StringBuilder對象.
下面是StringBuilder經常使用的一些很差記的操做:
//設置當前StringBuilder的初始大小爲1,最大長度爲2. //若是設置了最大值,那麼超過最大值會拋異常,若是沒有設置最大值 //超過初始值,長度會自動擴大兩倍 StringBuilder sb = new StringBuilder(); //輸出:0 這個長度是當前sb實例中字符串的長度,是字符串的實際長度 Console.WriteLine(sb.Length); //輸出:16,默認長度爲16,這個長度是當前sb的總長度 Console.WriteLine(sb.Capacity); //輸出StringBuilder的最大值.默認最大值爲21億 Console.WriteLine(sb.MaxCapacity); //經過數組的方式給sb中的字符串實例設置值,可是此時沒有初始化值,因此程序報錯 //sb[0] = 'A'; sb.Append("Hello World"); //輸出:H Console.WriteLine(sb[0]); //修改sb實例的索引爲0處的值爲A sb[0] = 'A'; //輸出:Aello World Console.WriteLine(sb.ToString()); //確保sb的長度爲66,若是沒有,自動擴大到66 sb.EnsureCapacity(66); //輸出:66 Console.WriteLine(sb.Capacity); StringBuilder sb1 = new StringBuilder("abc"); StringBuilder sb2 = new StringBuilder("abc"); //輸出:True 由於兩個StringBuilder實例中的字符串值相等,Capacity也相等 Console.WriteLine("sb1 equals sb2 is {0}", sb1.Equals(sb2)); //改變Capacity sb1.EnsureCapacity(66); //輸出:False 由於Capacity不一樣 Console.WriteLine("sb1 equals sb2 is {0}", sb1.Equals(sb2)); StringBuilder sb3 = new StringBuilder("Hello World"); //注:目標字符串不能有值,它不能像string的copyTo方法同樣去覆蓋原有的值,複製過去的字符串長度也不能超過目標字符串數組的長度 var destination = new char[6]; sb3.CopyTo(0, destination, 0, 2); //輸出:He Console.WriteLine(destination); //注:全部的操做,操做的都是同一個對象,可能擴展事後的StringBuilder對象實例,會是新的對象實例 Console.ReadKey();
四、StringBuilder支持鏈式操做
由於StringBuidler的大多數方法返回一個StringBuilder引用,因此支持鏈式操做,代碼以下:
//設置當前StringBuilder的初始大小爲1,最大長度爲2. //若是設置了最大值,那麼超過最大值會拋異常,若是沒有設置最大值 //超過初始值,長度會自動擴大兩倍 StringBuilder sb = new StringBuilder("Hell World"); sb.Insert(4, 'o').Replace('o', 'a').Remove(5, sb.Length - 5); Console.WriteLine("$"+ sb.ToString()+"$");
五、String類和StringBuilder類的差別
(1)、String類提供的方法多於StringBuilder類提供的方法,可是StringBuilder提供了更全面的Replace方法.因此StringBuilder沒法向String類使用的那樣靈活.