StringBuilder的實現(xiàn)與技巧
在上一篇進一步了解String
中,發(fā)現(xiàn)了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
通過上面的代碼,我們可以看出如果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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
通過上面的代碼,我們可以看出如果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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
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
通過上面的代碼,我們可以看出如果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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
通過上面的代碼,我們可以看出如果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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
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
通過上面的代碼,我們可以看出如果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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
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這步操作,將會引發(fā)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
//繼續(xù)超出,則Capacity=Capacity*2
4Capacity:128 Length:113
5Capacity:3
Length:2 //清空內容后,設置Capacity=1,重新添加了字符
6Capacity:7 Length:6
//后面的結果都類似
7Capacity:14
Length:12
從上面的代碼和結果可以說明StringBuilder中容量Capacity是如何增加的:創(chuàng)建一個StringBuilder之后,默認的Capacity初始化為16,接著我們添加17個字符,以方便看到Capacity的擴充后的值..大家在修改Capacity的時候,一定要注意21行的注釋,一定要確保Capacity
>=
Length,否則會引發(fā)ArgumentOutOfRangeException異常...看完結果,就可以推斷出Capacity的公式:
if (
Capacity < Length && Capacity > 0 ){
Capacity *=
2;
}
OK..看到公式就明白了..StringBuilder是以當前的Capacity*2來擴充的..所以,在使用StringBuilder需要特別注意,尤其是要拼接或追加N多字符的時候,要注意技巧的使用,可以適當的,有預見性的設置Capacity的值,避免造成過大內存的浪費,節(jié)約無謂的內存空間..例如,下列代碼就可以根據情況自動的擴展,而避免了較大的內存浪費.
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);需要特別說明的一點是,自動增加的容量,一定要根據實際預見的情況而改變,否則不但起不到優(yōu)化的作用,反而會影響到程序的性能..
另外,如果有時間的話,可以測試一下下面的代碼,用string和StringBuilder拼接字符串的區(qū)別..你會嚇到的!!
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 ));