今天最后一个问题

weikeli19 2016-07-01 08:25:29
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);
}
}
}
...全文
94 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你的 GetHashCode 只可能有两个值,0和1。为什么要这样?
wanghui0380 2016-07-01
  • 打赏
  • 举报
回复
地址100--->链表起始地址||对象A地址||下一个链表地址----->第2个对象的链表结构地址|对象C地址||下一个链表地址(因为这个例子里没有相同的hash了,所以这个链表地址为null) 地址200--》链表起始||对象C||next为null
wanghui0380 2016-07-01
  • 打赏
  • 举报
回复
首先你应该知道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#》里面,你真想去研究这些不如直接看这本书,这本书系统性很强,总比这零敲碎打来好
weikeli19 2016-07-01
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
保存的时候差不多就是这样一种结构
class Item
{
    public a Key;
    public object Value;
}

List<Item>[] data;
int bucketSize; //=data.Length
要取值的时候大概就是这样
object GetValue(a key)
{
    List<Item> entry = data[key.GetHashCode() % bucketSize];
    foreach(var item in entry)
        if(key.Equals(item.Key))
            return item.Value;
    throw new ItemNotFoundException(); //数据不存在的异常
}
不是 五星红旗人 我说的是图形方式 就是画个逻辑图 按照我上面的代码 它是一个什么样的逻辑图 是不是这样子的
Poopaye 2016-07-01
  • 打赏
  • 举报
回复
保存的时候差不多就是这样一种结构
class Item
{
    public a Key;
    public object Value;
}

List<Item>[] data;
int bucketSize; //=data.Length
要取值的时候大概就是这样
object GetValue(a key)
{
    List<Item> entry = data[key.GetHashCode() % bucketSize];
    foreach(var item in entry)
        if(key.Equals(item.Key))
            return item.Value;
    throw new ItemNotFoundException(); //数据不存在的异常
}
weikeli19 2016-07-01
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
没有相同的键啊 o1.Equals(o3); //false
那它在计算机里是怎么样一个逻辑存储方式呢?就用我上面代码的例子说明一下 谢谢了
Poopaye 2016-07-01
  • 打赏
  • 举报
回复
没有相同的键啊 o1.Equals(o3); //false

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧