当前位置: 代码迷 >> VB Dotnet >> [vb.net2013]也许被误导的哈希码值对象
  详细解决方案

[vb.net2013]也许被误导的哈希码值对象

热度:128   发布时间:2016-04-25 02:14:37.0
[vb.net2013]可能被误导的哈希码值对象
哈希码值对象列表,下面对象好像都是哈希吗值类型的对象,都支持哈希码代码应用。

这样的支持哈希码对象的运行速度极快,这就是哈希码优点。
唯一缺点是添加顺序是随机的。这就是我忧虑的一部分。

大家都说字典Dictionary和List对象添加数据顺序不变的,我不知道确实如此。
网上有的人说Dictionary也会添加记录顺序被改变的。那么,List也是如此?
因为,它们都是支持哈希码。
昂贵的相等比较过程时.添加记录数据顺序随机改变的话,那绝对是致命的错误!
少量代码测试中无法检测到的,有很多长期经验的程序员分享出自己的看法。


Sub MySub()
        Dim HashSet1 As New HashSet(Of String)
        Dim HashTable1 As New Hashtable
        Dim SortedDictionary1 As New SortedDictionary(Of Integer, String)
        Dim SortedList1 As New SortedList(Of Integer, String)
        
        Dim List1 As New List(Of String)
        List1.GetHashCode()
        Dim Dictionary1 As New Dictionary(Of Integer, String)
        Dictionary1.GetHashCode()
    End Sub


------解决方案--------------------

------解决方案--------------------
所有的对象都有GetHashCode这个成员函数,因为它在Object类中定义,所以有没有这个函数和一个数据结构是否使用哈希没有任何关系。
List(Of T)是有序的,是CIL保证的
Dictionary(Of T)实践上是有序的,但CIL规范是不保证其有序的,因此不应当依赖其有序性
如果你需要有序的键-值储存,可以考虑SortedList(Of T)或者SortedDictionary(Of T),二者的区别请看MSDN
------解决方案--------------------
用 Reflector 查了一下,你提到的这些对象都没有重写 GetHashCode(),所以它们的 HashCode 是和内容无关的。
实测证明:
Sub Main()
    Dim List1 As New List(Of String)
    Debug.Print("{0:X8}", List1.GetHashCode())
    List1.Add("a")
    Debug.Print("{0:X8}", List1.GetHashCode())
    List1.Add("b")
    Debug.Print("{0:X8}", List1.GetHashCode())
    List1.Clear()
    Debug.Print("{0:X8}", List1.GetHashCode())
End Sub

02B89EAA
02B89EAA
02B89EAA
02B89EAA