String和BulidString性能比較和內在機制 – JAVA編程語言程序開發技術文章

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內部有個足夠長的字符串數組,當字符串長度沒有超過數組長度的時候,所有的操作都是真對字符串數組的;當字符串長度足夠長,它又會智能創建一個更長的字符串數組,把原來數據復制到新的數組當中

發佈留言