C# GetHashCode、Equals函数和键值对集合的关系
C# GetHashCode、Equals函数和键值对集合的关系
说明
HashCode:Hash码。
特性:两个值,相同的的值生成的Hash肯定相同,Hash不同的值肯定不同。
下面一张图中,只有和“错号”一行或一列的才有意义。

作用:求Hash值效率比引用类型判断是否相等的函数Equals更快,所以被用来辅助判断键值对集合的键值是否已经存在。
说明:Equals和GetHashCode都是object的虚方法,可以被任意类型进行重写。Equals来判断两个值是否相等时用到了反射所以慢一点。
在键值对集合如HashTable中,添加键值对时,会分两步检验键值是否已经存在:第一步检查所添加的键的Hash值是否存在,不存在则直接添加;如果已经存在的话开始第二步,开始检查键是否存在Equals。
namespace JustTest
{
class Program
{
static void Main(string[] args)
{
var t = new Hashtable();
t.Add(new user { }, );
t.Add(new user { }, );
}
} class user
{
public override int GetHashCode()
{
Console.WriteLine("GetHashCode校验");
return ;
}
public override bool Equals(object o)
{
Console.WriteLine("Equals校验");
return base.Equals(o);
}
}
}

启示
可以进行代码优化:判断对象(或者字符串)是否存在时常常看到直接Equals的,但是更好的做法就是先判断两个值的hashcode是否相等,不相等的话直接添加就好了,如果相等的话然后再Equals判断是否相等
场合:注册时判断用户名是否存在等。

C# GetHashCode、Equals函数和键值对集合的关系的更多相关文章
- 从源码看HashMap键值对集合
之前我们看过了两种类型的集合,ArrayList集合和LinkedList集合,两种集合各有优势,我们不具体说了,但是本篇要看的集合可以完成它们完成不了的任务.比如:现有一篇文章,要你统计其中出现了哪 ...
- C#基础精华03(常用类库StringBuilder,List<T>泛型集合,Dictionary<K , V> 键值对集合,装箱拆箱)
常用类库StringBuilder StringBuilder高效的字符串操作 当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作. String 对象是不可变的. 每次使用 System. ...
- Hashtable 键值对集合
// Hashtable 键值对集合 一个键对应一个值 Hashtable ht=new Hashtable(); ht.Add(,"张三"); ht.Add(,'男'); ht ...
- 04.Dictionary字典键值对集合
Dictionary字典键值对集合和Hashtable键值对集合的功能非常类似, 只是在声明的时候,必须为其制定值的类型. 示例代码: namespace _11.Dictionary字典集合的学习 ...
- C# HTTP系列12 以form-data方式上传键值对集合到远程服务器
系列目录 [已更新最新开发文章,点击查看详细] 使用multipart/form-data方式提交数据与普通的post方式有一定区别.multipart/form-data的请求头必须包含一个 ...
- JavaScript键值对集合怎么使用
JavaScript键值对集合怎么使用 我们可以对此键值对集合分为3种难度 1.简单的使用 var arr = { 'cn': "中国", 'usa': '美国', 'jp': ' ...
- 键值对集合Dictionary<K,V>根据索引提取数据
Dictionary<K,V>中ToList方法返回 List<KeyValuePair<K,V>>定义可设置检索的键/值对
- C# HTTP系列13 以form-data方式上传多个文件以及键值对集合到远程服务器
系列目录 [已更新最新开发文章,点击查看详细] 类似于以下场景,将表单中的用户信息(包含附件)上传到服务器并保存到数据库中, <form id="form1" run ...
- 键值对集合 dict(字典)
xx= { ss, ss } 创建字典 len(ss) 返回字典到长度,len函数可以返回任何集合的长度,list.tuple.dict都是集合的一种 什么是dict 我们已经知道,list 和 tu ...
随机推荐
- ORA-12521: TNS: 监听程序当前无法识别连接描述符中请求的实例(原)
今天登录PL/SQL出现问题: ---------------------------sys@RAC1 as SYSDBA---------------------------ORA-12521: T ...
- kvmgt-kernel 实现GPU虚拟化
KVMGT-kernel是Intel开源技术01.org推出的一项完整的GPU虚拟化解决方案,在KVM和XEN的基础上实现.本文档对该技术进行相应测试,让大家有个基本参考和了解.KVMGT-kerne ...
- 《OpenCL异构并行编程实战》补充笔记散点,第一至四章
▶ 总体印象:适合 OpenCL 入门的书,有丰富的代码和说明,例子较为简单.先把 OpenCL 代码的基本结构(平台 → 设备 → 上下文 → 命令队列 → 创建缓冲区 → 读写缓冲区 → 编译代码 ...
- 36. Valid Sudoku + 37. Sudoku Solver
▶ 有关数独的两个问题. ▶ 36. 检测当前盘面是否有矛盾(同一行.同一列或 3 × 3 的小框内数字重复),而不关心该盘面是否有解. ● 初版代码,24 ms,没有将格子检测函数独立出去,行检测. ...
- 内存表 FDMemTable ClientDataSet CreateDataSet 动态创建字段
https://community.embarcadero.com/index.php/blogs/entry/firedac-in-memory-dataset-tfdmemtable Client ...
- 使用phpexcel导出到xls文件的时候出现乱码解决
<?php include 'global.php'; $ids = $_GET['ids']; $sql = "select * from crm_cost_end where id ...
- EL的基本使用
总结:EL操作的是作用域 <body> <% Users users = new Users("lisi","lisi123","l ...
- windchill 跑物料变更流程后无法发送物料到SAP
2042000065.2042000064.2042000074.2042000066在发主数据时,流程卡住,SAP返回信息为空 核查:PLM后台日志只显示变更零件,开始,然后就结束 原因:ECR号为 ...
- 第七章 二叉搜索树 (a)概述
- (基于Java)算法之动态规划——矩阵连乘问题
动态规划(Dynamic Programming):与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适用于动态规划法求解 ...