StringBuilder的實現與技巧
StringBuilder的實現與技巧
在上一篇進一步瞭解String 中,發現了string的不便之處,而string的替代解決方案就是StringBuilder的使用..它的使用也很簡單System.Text.StringBuilder
sb = new System.Text.StringBuilder();這樣就初始化了一個StringBuilder ..之後我們可以通過Append()來追加字串填充到sb中..在你初始化一個StringBuilder 之後,它會自動申請一個預設的StringBuilder 容量(預設值是16),這個容量是由Capacity來控制的.並且允許,我們根據需要來控制Capacity的大小,也可以通過Length來獲取或設定StringBuilder 的長度..
先來看Length的用法:
1System.Text.StringBuilder sb = new System.Text.StringBuilder();
2sb.Append( "123456789" );//新增一個字串
3sb.Length = 3;//設定容量為3
4Console.WriteLine( sb.ToString() );//這裡輸出:123
5
6sb.Length = 30;//重新設定容量為30
7Console.WriteLine( sb.ToString() + ",結尾");//這裡在原來字串後面補齊空格,至到Length的為30
8Console.WriteLine( sb.Length );//這裡輸出的長度為30
2sb.Append( "123456789" );//新增一個字串
3sb.Length = 3;//設定容量為3
4Console.WriteLine( sb.ToString() );//這裡輸出:123
5
6sb.Length = 30;//重新設定容量為30
7Console.WriteLine( sb.ToString() + ",結尾");//這裡在原來字串後面補齊空格,至到Length的為30
8Console.WriteLine( sb.Length );//這裡輸出的長度為30
通過上面的程式碼,我們可以看出如果StringBuilder 中的字元長度小於Length的值,則StringBuilder 將會用空格硬填充StringBuilder ,以滿足符合長度的設定..如果StringBuilder 中的字元長度大於Length的值,則StringBuilder 將會擷取從第一位開始的Length個字元..而忽略超出的部分..
再來看看最重要的部分Carpacity的用法:
1System.Text.StringBuilder sb = new System.Text.StringBuilder();//初始化一個StringBuilder
2Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
3Console.WriteLine( "\t Length:" + sb.Length );
4
5sb.Append( '1',17 );//新增一個字串,這裡故意新增17個字元,是為了看到Capacity是如何被擴充的
6Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
7Console.WriteLine( "\t Length:" + sb.Length );
8
9sb.Append( '2',32 );//新增一個字串
10Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
11Console.WriteLine( "\t Length:" + sb.Length );
12
13sb.Append( '3',64 );//新增一個字串
14Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
15Console.WriteLine( "\t Length:" + sb.Length );
16
17//注意這裡:如果你取消Remove這步操作,將會引發ArgumentOutOfRangeException異常,因為當前容量小於
18
19//Length,這在自己控制StringBuilder的時候務必要注意容量溢位的問題
20
21sb.Remove(0,sb.Length);//移出全部內容,再測試
22sb.Capacity = 1;//重新定義了容量
23sb.Append( 'a',2 );
24Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
25Console.WriteLine( "\t Length:" + sb.Length );
26
27sb.Append( 'b',4 );
28Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
29Console.WriteLine( "\t Length:" + sb.Length );
30
31sb.Append( 'c',6 );
32Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
33Console.WriteLine( "\t Length:" + sb.Length
2Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
3Console.WriteLine( "\t Length:" + sb.Length );
4
5sb.Append( '1',17 );//新增一個字串,這裡故意新增17個字元,是為了看到Capacity是如何被擴充的
6Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
7Console.WriteLine( "\t Length:" + sb.Length );
8
9sb.Append( '2',32 );//新增一個字串
10Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
11Console.WriteLine( "\t Length:" + sb.Length );
12
13sb.Append( '3',64 );//新增一個字串
14Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
15Console.WriteLine( "\t Length:" + sb.Length );
16
17//注意這裡:如果你取消Remove這步操作,將會引發ArgumentOutOfRangeException異常,因為當前容量小於
18
19//Length,這在自己控制StringBuilder的時候務必要注意容量溢位的問題
20
21sb.Remove(0,sb.Length);//移出全部內容,再測試
22sb.Capacity = 1;//重新定義了容量
23sb.Append( 'a',2 );
24Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
25Console.WriteLine( "\t Length:" + sb.Length );
26
27sb.Append( 'b',4 );
28Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
29Console.WriteLine( "\t Length:" + sb.Length );
30
31sb.Append( 'c',6 );
32Console.Write( "Capacity:" + sb.Capacity );//這裡的Capacity會自動擴大
33Console.WriteLine( "\t Length:" + sb.Length
上面的程式碼輸出的結果:
1Capacity:16 Length:0 //輸出第一次,預設的Capacity是16
2Capacity:32 Length:17 //第二次,我們故意新增了17個字元,於是Capacity=Capacity*2
3Capacity:64 Length:49 //繼續超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3 Length:2 //清空內容後,設定Capacity=1,重新新增了字元
6Capacity:7 Length:6 //後面的結果都類似
7Capacity:14 Length:12
2Capacity:32 Length:17 //第二次,我們故意新增了17個字元,於是Capacity=Capacity*2
3Capacity:64 Length:49 //繼續超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3 Length:2 //清空內容後,設定Capacity=1,重新新增了字元
6Capacity:7 Length:6 //後面的結果都類似
7Capacity:14 Length:12
從上面的程式碼和結果可以說明StringBuilder中容量Capacity是如何增加的:建立一個StringBuilder之後,預設的Capacity初始化為16,接著我們新增17個字元,以方便看到Capacity的擴充後的值..大家在修改Capacity的時候,一定要注意21行的註釋,一定要確保Capacity >= Length,否則會引發ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if ( Capacity < Length && Capacity > 0 ){
Capacity *= 2;
}
OK..看到公式就明白了..StringBuilder是以當前的Capacity*2來擴充的..所以,在使用StringBuilder需要特別注意,尤其是要拼接或追加N多字元的時候,要注意技巧的使用,可以適當的,有預見性的設定Capacity的值,避免造成過大記憶體的浪費,節約無謂的記憶體空間..例如,下列程式碼就可以根據情況自動的擴充套件,而避免了較大的記憶體浪費.
1System.Text.StringBuilder sb = new System.Text.StringBuilder();
2int i = 0;
3long StartTime = DateTime.Now.Ticks;
4while ( i < 100000 ) {
5sb.Append( i.ToString() );
6i++;
7}
8long EndTime = DateTime.Now.Ticks;
9
10Console.WriteLine( "時間:" + ( EndTime-StartTime ) + "\t Capacity:"+ sb.Capacity + "\t Length:"
11
12+ sb.Length);
13
14System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
15i = 0;
16StartTime = DateTime.Now.Ticks;
17while ( i < 100000 )
18{
19if ( sb1.Capacity <= sb1.Length )//先判斷是否>Length
20sb1.Capacity += 7;//這裡一定要根據情況的增加容量,否則會有效能上的消耗
21sb1.Append( i.ToString() );
22i++;
23}
24EndTime = DateTime.Now.Ticks;
25
26Console.WriteLine( "時間:" + ( EndTime-StartTime ) + "\t Capacity:"+ sb1.Capacity + "\t
27
28Length:" + sb1.Length);
需要特別說明的一點是,自動增加的容量,一定要根據實際預見的情況而改變,否則不但起不到優化的作用,反而會影響到程式的效能..2int i = 0;
3long StartTime = DateTime.Now.Ticks;
4while ( i < 100000 ) {
5sb.Append( i.ToString() );
6i++;
7}
8long EndTime = DateTime.Now.Ticks;
9
10Console.WriteLine( "時間:" + ( EndTime-StartTime ) + "\t Capacity:"+ sb.Capacity + "\t Length:"
11
12+ sb.Length);
13
14System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
15i = 0;
16StartTime = DateTime.Now.Ticks;
17while ( i < 100000 )
18{
19if ( sb1.Capacity <= sb1.Length )//先判斷是否>Length
20sb1.Capacity += 7;//這裡一定要根據情況的增加容量,否則會有效能上的消耗
21sb1.Append( i.ToString() );
22i++;
23}
24EndTime = DateTime.Now.Ticks;
25
26Console.WriteLine( "時間:" + ( EndTime-StartTime ) + "\t Capacity:"+ sb1.Capacity + "\t
27
28Length:" + sb1.Length);
另外,如果有時間的話,可以測試一下下面的程式碼,用string和StringBuilder拼接字串的區別..你會嚇到的!!
1System.Text.StringBuilder sb = new System.Text.StringBuilder();
2int i = 0;
3long StartTime = DateTime.Now.Ticks;
4while ( i < 100000 ) {
5sb.Append( i.ToString() );
6i++;
7}
8long EndTime = DateTime.Now.Ticks;
9
10Console.WriteLine( "時間:" + ( EndTime-StartTime ) );
11
12string sb1 = null;
13i = 0;
14StartTime = DateTime.Now.Ticks;
15while ( i < 100000 )
16{
17sb1 += i;
18i++;
19}
20EndTime = DateTime.Now.Ticks;
21Console.WriteLine( "時間:" + ( EndTime-StartTime ));
2int i = 0;
3long StartTime = DateTime.Now.Ticks;
4while ( i < 100000 ) {
5sb.Append( i.ToString() );
6i++;
7}
8long EndTime = DateTime.Now.Ticks;
9
10Console.WriteLine( "時間:" + ( EndTime-StartTime ) );
11
12string sb1 = null;
13i = 0;
14StartTime = DateTime.Now.Ticks;
15while ( i < 100000 )
16{
17sb1 += i;
18i++;
19}
20EndTime = DateTime.Now.Ticks;
21Console.WriteLine( "時間:" + ( EndTime-StartTime ));
轉:http://lixianhuei.cnblogs.com/archive/2005/12/27/305708.html
相關文章
- 遞推的思維構建與技巧實現
- String與StringBuilderUI
- 手遊中實時音視訊的開發經驗與實現技巧
- 實現資料管理現代化的 7 個技巧
- 常見演算法及問題需注意的技巧與簡單實現演算法
- String,StringBuffer與StringBuilder的區別UI
- String、StringBuffer、與StringBuilder的區別UI
- String,StringBuffer與StringBuilder的區別??UI
- 【資料結構】串(String、StringBuilder、StringBuffer)的JAVA程式碼實現資料結構UIJava
- CSS 小技巧 | 一行程式碼實現頭像與國旗的融合CSS行程
- Java的JDK下StringBuffer與StringBuilder的區別JavaJDKUI
- go 技巧: 實現一個無限 buffer 的 channelGo
- 堆的原理與實現
- 三千字講清TypeScript與React的實戰技巧TypeScriptReact
- PHP新手必須掌握的入門與實戰技巧PHP
- TypeScript 隨想 · 實際應用與技巧TypeScript
- 如何實現社群長期活躍的方法和技巧
- 擴充套件Zuul實現敏捷開發的小小技巧套件Zuul敏捷
- vue資料傳遞–我有特殊的實現技巧Vue
- Python實現火柴人的設計與實現Python
- Mac實用技巧:如何設定長按delete實現連續刪除小技巧!Macdelete
- Titan 的設計與實現
- LFU 的設計與實現
- 富集分析的原理與實現
- 前端模板的原理與實現前端
- jsonp的原理與實現JSON
- Projective Texture的原理與實現Project
- API的設計與實現API
- [SentencePiece]Tokenizer的原理與實現
- StringBuilder物件的常用方法UI物件
- Rust 中的 HashMap 實戰指南:理解與最佳化技巧RustHashMap
- Laravel 小技巧 - 讓路由實現類似 Model::query 的效果Laravel路由
- 23個最有用的ES檢索技巧(Java API實現)JavaAPI
- js技巧:十幾行的程式碼實現vue.watchJSVue
- StringBuilder類UI
- [Unity]StringBuilderUnityUI
- 小技巧分享:在 Go 如何實現列舉?Go
- ObjectC Hook函式的實現與實戰ObjectHook函式