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进行彻底的比较。
GetHashCode作用的更多相关文章
- SQLSERVER一些公用DLL的作用解释
如果你的SQLSERVER安装在C盘的话,下面的路径就是相应SQLSERVER版本的公用DLL的存放路径 SQL2005 C:\Program Files\Microsoft SQL Server\9 ...
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经> ...
- C# GetHashCode、Equals函数和键值对集合的关系
C# GetHashCode.Equals函数和键值对集合的关系 说明 HashCode:Hash码.特性:两个值,相同的的值生成的Hash肯定相同,Hash不同的值肯定不同. 下面一张图中,只有和“ ...
- 关于 warning CS0659:“***”重写Object.Equals(object o)但不重写Object.GetHashCode()
对象相等性和同一性 System.Object 类型提供了以下方法, namespace System { // // 摘要: // 支持 .NET Framework 类层次结构中的所有类,并为派生 ...
- if __name__== "__main__" 的意思(作用)python代码复用
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ...
- (转载)linux下各个文件夹的作用
linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...
- github中的watch、star、fork的作用
[转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...
- web.xml中welcome-file-list的作用
今天尝试使用struts2+ urlrewrite+sitemesh部署项目,结果发现welcome-file-list中定义的欢迎页不起作用: <welcome-file-list> & ...
- web.xml中load-on-startup的作用
如下一段配置,熟悉DWR的再熟悉不过了:<servlet> <servlet-name>dwr-invoker</servlet-name> <ser ...
随机推荐
- flask第十一篇——自定义url转换器
首先和大家说一下flask的组成,flask其实是werkzeug(路由和http处理)+SQLAlchemy(数据库)+Jinja2(模板)组成的,今天我们要看到的东西就是`werkzeug`里面的 ...
- 关于fflush、缓冲区、scanf、EOF等问题真麻烦
1.为什么 fflush(stdin)是错的 http://u637.springnote.com/pages/6288463.xhtml(已经bad request了) 首先请看以下程序: #inc ...
- vs2013 快捷键
//////////////// 编辑: ctrl+-(shift+ctrl+-):移动光标到上次位置或相反,比如定位一个函数,转到函数定义后想回到函数使用处,则用ctrl+-,若又想回到函数 ...
- python模块--json \ pickle \ shelve \ XML模块
一.json模块 之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,e ...
- toxiproxy 安装试用
备注: 实际上是一个代理工具,但是又不是简单的进行代理(tcp,可以配置策略,toxics 实现延迟,模拟故障, 对于这个大家可能了解的就是netflix 公司的chaos monkey, ...
- bzoj 2039 [2009国家集训队]employ人员雇佣——二元关系
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2039 用最小割看.对于一组关系 i , j ,如果都选,收益 2*Ei,j,可以看作0,作为 ...
- Android 从上层到底层-----jni层
CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 led_jni.h path:hardware/rockchip/fi ...
- 最近项目和java对接,涉及到java的DESede加解密算法
google后找到这个作者的一篇博客,搬过来用 http://hersface.com/page/17.html <?php class DESede{ /** * 加密 * @param $d ...
- C#操作MySql数据库帮助类(Dapper,T-Sql)
using System.Text; using MySql.Data.MySqlClient; using System.Data; using Dapper; using System.Refle ...
- coding style 的两点
通俗介绍coding style两点建议: 模块划分 这个如果做得不好,简直不能忍.有的代码非常莫名其妙,有些东西本身不复杂,非要将其拆成好几个部分,然后做成一个一个碎散的模块,这样并不好.举个例子, ...