C#遇到相同键值 就是相同的键 相同的值 这该怎么解释 它在计算机里是怎么存储的? 例如本人下面的代码~
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace delete
{
class a
{
public int Id { get; private set; }
public a(int i)
{
Id = i;
}
public override bool Equals(object obj)
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace delete
{
class a
{
public int Id { get; private set; }
public a(int i)
{
Id = i;
}
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
return Id == ((a)obj).Id;
}
//返回余2的结果
public override int GetHashCode()
{
return Id % 2;
}
}
class Program
{
static void Main(string[] args)
{
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);
dic.Add(o3, 123);
foreach (var x in dic)
Console.WriteLine(x);
}
}
}
解决方案
10
没有相同的键啊
o1.Equals(o3); //false
o1.Equals(o3); //false
10
首先你应该知道hash表怎么存,hash表查找比一般列表快,原因是他不遍历搜索,他直接定位,他采用和计算机内存寻址相相似的方式基地址+偏移量,直接内存寻址
那么在解释hashcode的问题,假如你把hashcode计算出的那个数字,当做偏移量这个偏移量所在的地方存储了一个对象基本链表描述(有关链表这块本人看书),打比方说:
对象A–hashcode是100
对象B-hashcode是200
对象C-hashcode是100
那么他的存储方式是
相对地址100的地方保存一个链表起始对象A的链表引用指针地址,同时链表next指针指到保存对象C的链表单元地址
而相对地址200的地方 则保存链表起始对象C的链表引用指针地址,next指针则为null
这样做的好处是,不用遍历3个对象,他只需先定位到hashcode地方,然后遍历链表就知道这个hashcode有多少对象
ps:这些东西的解释同样依然在《Clr via C#》里面,你真想去研究这些不如直接看这本书,这本书系统性很强,总比这零敲碎打来好
那么在解释hashcode的问题,假如你把hashcode计算出的那个数字,当做偏移量这个偏移量所在的地方存储了一个对象基本链表描述(有关链表这块本人看书),打比方说:
对象A–hashcode是100
对象B-hashcode是200
对象C-hashcode是100
那么他的存储方式是
相对地址100的地方保存一个链表起始对象A的链表引用指针地址,同时链表next指针指到保存对象C的链表单元地址
而相对地址200的地方 则保存链表起始对象C的链表引用指针地址,next指针则为null
这样做的好处是,不用遍历3个对象,他只需先定位到hashcode地方,然后遍历链表就知道这个hashcode有多少对象
ps:这些东西的解释同样依然在《Clr via C#》里面,你真想去研究这些不如直接看这本书,这本书系统性很强,总比这零敲碎打来好