01 | static void Main( string [] args)
|
02 | {
|
03 | TestString(); |
04 | TestStringBuilder();
|
05 | }
|
06 | |
07 | public static
void TestString()
|
08 | {
|
09 | DateTime startTime = DateTime.Now;
|
10 | string str =
string .Empty; |
11 | for ( int i = 0; i <
10000; i++) // 一万次
|
12 | { |
13 | str += "a" ; |
14 | } |
15 | DateTime endTime = DateTime.Now;
|
16 | TimeSpan timeSpan = endTime - startTime;
|
17 | Console.WriteLine( "String耗时:{0}" ,timeSpan); |
18 | |
19 | |
20 | }
|
21 | |
22 | public static
void TestStringBuilder() |
23 | {
|
24 | DateTime startTime = DateTime.Now;
|
25 | StringBuilder sb = new StringBuilder();
|
26 | for ( int i = 0; i <
1000000; i++) //一百万次
|
27 | { |
28 | sb.Append( "a" );
|
29 | } |
30 | DateTime endTime = DateTime.Now;
|
31 | TimeSpan timeSpan = endTime - startTime;
|
32 | Console.WriteLine( "StringBuilder耗时:{0}" ,timeSpan); |
33 | Console.ReadLine(); |
34 | |
35 | } |
显示结果:
原因分析:
(1)string对象是不可变的
string str="a";
str=str+"b";//这句代码让人误以为str会增加长度;实际上str是创建一个新的对象,而第一个对象被丢弃,成为垃圾收集器的对象。
(2)StringBuilder是可变的
而StringBuilder内部有个足够长的字符串数组,当字符串长度没有超过数组长度的时候,所有的操作都是真对字符串数组的;当字符串长度足够长,它又会智能创建一个更长的字符串数组,把原来数据复制到新的数组当中。