代码之家  ›  专栏  ›  技术社区  ›  Mads Lee Jensen

为什么getHashCode()很重要?

  •  6
  • Mads Lee Jensen  · 技术社区  · 15 年前

    我想知道 object.GetHashCode() 用于。我读到它被集合用来唯一地标识键。但我想测试一下,结果不是我所期望的。

    struct Animal
    {
        public string Name { get; set; }
        public int Age { get; set; }
    
        public Animal(string name, int age) : this()
        {
            Name = name;
            Age = age;
        }
    
        public override int GetHashCode()
        {
            return Age.GetHashCode();
        }
    }
    
    object doggy = new Animal("Dog", 25);
    object cat = new Animal("Cat", 25);
    
    Hashtable table = new Hashtable();
    table.Add(doggy, "Dog");
    table.Add(cat, "Cat");
    
    Console.WriteLine("{0}", table[cat]);
    Console.WriteLine("{0}", table[doggy]);
    

    我本以为“cat”会覆盖“dog”或某种错误,告诉我“key already exists”,但输出是

    “猫” “狗”

    2 回复  |  直到 11 年前
        1
  •  12
  •   Marc Gravell    15 年前

    GetHashCode 只是 第一 检查,用于确定不相等和 可能的 平等。之后,检查等于。对象的默认值为引用相等,结构的默认值为成员级比较。覆盖 Equals 给出一个适当的实现(与散列代码配对),它应该给出您期望的结果(重复的键)。

    顺便说一句,IDE可能已经在警告你 方法 等于 应该一直一起治疗…

        2
  •  2
  •   supercat    15 年前

    散列码用作将对象划分为组的第一个检查。如果集合包含其中每个项的哈希代码,则可以通过首先搜索哈希代码与所需项的哈希代码匹配的项来搜索项。一旦它找到一个或多个这样的项目,它就可以更详细地检查它们。理想情况下,不相等的对象总是返回不同的哈希代码,但这并不实际。如果不相等的对象返回相同的散列码,则可能需要在任何时候查找其中一个散列码时详细检查所有散列码。

    推荐文章