CLR自動維護一個稱為”內置池“(暫存池)(intern pool)的表,在編譯時此表包含程式中聲明的每個唯一的字元串常量的單個實例,以及以編程方式創建的String類的任何唯一實例。 內置池被實現為散列表。使用散列表即表示,一個字元串可以通過一個數字或”散列碼“來表示。這樣比較和搜索字元串就非常有 ...
CLR自動維護一個稱為”內置池“(暫存池)(intern pool)的表,在編譯時此表包含程式中聲明的每個唯一的字元串常量的單個實例,以及以編程方式創建的String類的任何唯一實例。
內置池被實現為散列表。使用散列表即表示,一個字元串可以通過一個數字或”散列碼“來表示。這樣比較和搜索字元串就非常有效,因為這不是逐個字元比較字元串,而僅僅比較散列值。
內置池節省字元串存儲空間。如果將一個字元串常量賦給幾個變數,則每一個變數引用內置池中相同的常量,而不是引用具有相同值的String類的幾個不同實例。
可以測試如下代碼:
Const APPNAME As String = "運維應用程式"
Console.WriteLine(String.IsInterned(APPNAME) <> Nothing)
Dim s1 As String
Dim s2 As String
s1 = "這是一個測試的字元串"
s2 = "這是一個測試的字元串"
Console.WriteLine(String.IsInterned(s1) <> Nothing)
Console.WriteLine("s1的散列值:{0}", s1.GetHashCode())
Console.WriteLine("s2的散列值:{0}", s2.GetHashCode())
Dim s3 As String = s1 & DateTime.Now().ToString()
Console.WriteLine("s3的散列值:{0}", s3.GetHashCode())
Console.WriteLine(String.IsInterned(s3) <> Nothing)
運行以下代碼會發現.NET會內置了包含字元串常量,以及編程方式創建的字元串。
會發現s1和s2引用同個字元串實例。s3不會被內置,因為在編譯時並不能確認s3的具體內容。也可以使用String.Intern強制內置一個變數。
用圖來表示一下:
那麼內置有什麼好處呢,對比下麵的代碼,第二個方法比第一個方法快3倍以上。
Sub Main()
Console.Write("請輸入你的名字:")
Dim userName As String = Console.ReadLine()
Method1(userName)
Method2(userName)
Console.Read()
End Sub
Public Sub Method1(ByVal username As String)
Dim strHTML As String
'每次迴圈創建3次字元串,分配3次記憶體
Dim startms As Integer = Environment.TickCount()
For i As Integer = 1 To 1000000
strHTML = "<HTML><HEAD></HEAD><BODY>"
strHTML &= "我的名字是:"
strHTML &= username
strHTML &= "</BODY></HTML>"
Next
Dim endms As Integer = Environment.TickCount()
Console.WriteLine("總耗時:{0}微秒", (endms - startms))
End Sub
Public Sub Method2(ByVal username As String)
Dim strHTML As String
Const strPrefix As String = "<HTML><HEAD></HEAD><BODY>"
Const strSuffix As String = "</BODY></HTML>"
'只創建一次字元串
Dim startms As Integer = Environment.TickCount()
For i As Integer = 1 To 1000000
strHTML = strPrefix & "請輸入你的名字:" & userName & strSuffix
Next
Dim endms As Integer = Environment.TickCount()
Console.WriteLine("總耗時:{0}微秒", (endms - startms))
End Sub
以上方法只是拋磚引玉,在實際應用中靈活應用。在一些web應用程式中有大量字元串拼接操作的,可以多使用內置。畢竟處理速度快,能夠處理的併發就越高。