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


1、為什么需要StringBuilder類?

因為String類型代表不可變字符串,所以無法對當前String類型實例進行處理.所以FCL提供了System.Text.StringBuilder類型,它可以接受字符串和字符作為參數,並對其進行高效動態處理,最終返回String對象.so,你可以將StringBuilder想象成對String字符串進行各種騷操作的特殊的構造器.通過Copy On Write技術實現的可變字符串的代理類,關於Copy On Wirte請參考Proxy代理模式(結構型模式)的案例二.

 

2、StringBuilder處理字符數組和字符串須知

(1)、StringBuilder對象實例包含一個字段,該字符引用了由Char字符構成的數組,可以用StringBuilder的各個成員來操作該字符串數組.

(2)、高效率地縮短字符串或更改字符串中的字符.

(3)、如果字符串變大,超過了事先分配的字符數組大小.StringBuilder會自動分配一個新的、更大的數組,復制字符.並開始使用新數組.前一個數組被垃圾回收.

(4)、當使用StringBuilder處理完目標字符串之后,可以調用StringBuilder的ToString方法即可將StringBuilder的處理完的數組轉換成String.這樣就會在堆上新建String對象.之后可以繼續處理StringBuidler中的字符串.以后可再次調用ToString把它轉換成另一個字符串。

常規的對字符串進行多次處理:

            string str = " Hello World";
            //對string進行Trim()一去字符操作
            //執行過程如下:
            //1、先從字符串的開頭開始處理,第一個是空格,檢索傳入的參數中是否有空格,有的話清除(如果第一個是連續的空字符,那么所有的空格都清除)
            //如果第一個被清除掉了,那么繼續下一個字母H,和上面一樣的流程.如果沒有被清除掉,那么不在處理開頭,轉去清楚末尾的字母
            //2、當開頭的字母處理完畢,接着開始處理末尾的,流程和開頭的一致
            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就能解決這個問題,保證進行多次字符串操作的同時,還能確保操作的是同一個實例.

            //設置當前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對象實例,會是新的對象實例

 

 3、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();

 

4、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()+"$");

 

5、String類和StringBuilder類的差異

(1)、String類提供的方法多於StringBuilder類提供的方法,但是StringBuilder提供了更全面的Replace方法.所以StringBuilder無法向String類使用的那樣靈活.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM