今天最后一个问题

.Net技术 码拜 8年前 (2016-02-24) 921次浏览
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)
{

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

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#》里面,你真想去研究这些不如直接看这本书,这本书系统性很强,总比这零敲碎打来好

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明今天最后一个问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)