zoukankan      html  css  js  c++  java
  • GetHashCode作用

    除了以下的转载,再补充几点:

    1、相同对象的hashcode一定相同,不同的hashcode不一定不相同。

    2、好的散列算法可以更均匀的分布,进而可以更快的索引

    3、据说,值对象的hashcode由第一个字段得来

    4、hashtable,dictionary等相关的类需要借助hash值来判断KEY(只是辅助作用,为了更快,最终还是要靠equals来判断),原理上,只有immutable的对象才可以作为KEY,否则,将有可能永远找不到某个VALUE了。

    以下转载

    我觉得简而言之GetHashCode的作用就是:尽量用最快的时间对对象进行初步判断。当然这里时间的快慢和判断的深度没有具体要求,只要没有走极端就可以(比如太费时间,或者判断深度太浅)。因此没必要吧GetHashCode搞得太复杂!

    class a
    {
        public int Id { get; private set; }
        public a(int i)
        {
            Id = i;
        }
    
        public override bool Equals(object obj)
        {
            Console.WriteLine("Equals");
            if (obj == null || GetType() != obj.GetType())
            {
                return false;
            }
    
            return Id == ((a)obj).Id;
        }
    
            //返回余2的结果
        public override int GetHashCode()
        {
            Console.WriteLine("GetHashCode");
            return Id % 2;
        }
    }
    var o1 = new a(1); //GetHashCode返回1
    var o2 = new a(2); //GetHashCode返回0
    var o3 = new a(3); //GetHashCode返回1
    
    var dic = new Dictionary<a, object>();
    dic.Add(o1, 123);
    Console.WriteLine("分隔符");
    Console.WriteLine(dic.ContainsKey(o2));
    Console.WriteLine("分隔符");
    Console.WriteLine(dic.ContainsKey(o3));
    GetHashCode
    分隔符
    GetHashCode
    False
    分隔符
    GetHashCode
    Equals
    False

    最后你可能有些疑惑为什么不直接用Equals非得搞个GetHashCode在前面先判断一下?这个是由于Equals方法必须把两个对象搞清楚是等于 还是不等于,所以可能效率不是最优的(况且Object.Equals通常包含类型的转换,这个可以参考IEquatable或 IEqualityComparer,他们支持泛型),而GetHashCode不需要绝对弄清楚是否相等所以可以优化下效率。举个最简单的例子,比较两 个人是不是完全一样(一样的话代表是他的克隆人),Equals会一个细胞接一个细胞得比较,而GetHashCode可以通过判断性别,长相,声音…… 快速得进行判断。所以先用GetHashCode会很快的判断出许多不同的人,当然如果GetHashCode返回True(遇到了双胞胎或者克隆人), 再用Equals进行彻底的比较。

  • 相关阅读:
    ssm框架整合入门系列——配置SpringMVC dispatcherServlet-servlet.xml
    vue学习——v-for语句
    ssm框架整合入门系列——编写ssm整合的关键配置文件(web.xml)
    ssm框架整合入门系列——maven工程引入jar包
    jQuery(7)——DOM操作 html,html,val,attr方法
    ssm框架整合入门系列——MyEclipse创建maven工程
    ssm框架整合入门系列——一个简单的用户管理系统
    Vue学习(0)——第一个demo
    jQuery(6)——jQuery animate动画
    julia开发环境安装——VS code扩展和JuliaPro两种方式
  • 原文地址:https://www.cnblogs.com/qook/p/5421654.html
Copyright © 2011-2022 走看看