C# 高效率建立字符串類(StringBuilder)

一、爲何須要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類使用的那樣靈活.

相關文章
相關標籤/搜索