Data structures 基本散列概念

Data structures 基本散列概念,data-structures,hashmap,hashtable,Data Structures,Hashmap,Hashtable,我有一个非常基本的问题。相信我,我读过很多书,看过很多视频,但都没有找到答案。 假设我们有HashMap。 我有3个(a,b,c)值映射到同一个散列,a和b是相同的,但c是不同的。 如果我只向hastable添加a和b,hashMap如何知道它不是冲突 假设我们有Hashmap。。。。现在我调用put(obj1,“Test”),然后将(obj2,“Test”)obj1和obj2映射到同一个键。。。。你能告诉我这两个调用要存储什么哈希映射吗 它会存储实际的对象吗? 如果否,如果obj1和obj2相

我有一个非常基本的问题。相信我,我读过很多书,看过很多视频,但都没有找到答案。 假设我们有HashMap。 我有3个(a,b,c)值映射到同一个散列,a和b是相同的,但c是不同的。 如果我只向hastable添加a和b,hashMap如何知道它不是冲突

假设我们有Hashmap。。。。现在我调用put(obj1,“Test”),然后将(obj2,“Test”)obj1和obj2映射到同一个键。。。。你能告诉我这两个调用要存储什么哈希映射吗

它会存储实际的对象吗? 如果否,如果obj1和obj2相同,它将如何在第二次调用时确定它不是冲突


谢谢

大多数哈希表需要存储对象提供两位支持—GetHashCode()和Equals()

如果两个对象返回相同的GetHashCode(),但它们与Equals()的比较返回true,则它们表示相同的数据,因此不是冲突,而是重复的条目

如果两个对象返回相同的GetHashCode(),并且它们的比较返回false,则哈希表知道这些对象代表不同的事物,因此将其视为冲突


这就是为什么在许多oop语言(如C#)中,必须在存储对象中过度使用/实现GetHashCode()和Equals()。如果您实现了这些方法,当与Equals()比较时,两个对象返回true,但从GetHashCode()返回不同的值,那么您就有一个bug。

根据Wikipedia:

在计算机科学中,哈希表或哈希映射是 使用哈希函数映射标识值,称为键(例如 人员姓名)的关联值(例如,其电话号码) 数字)。因此,哈希表实现了一个关联数组

Wiki还将关联数组称为“由(键、值)对集合组成的抽象数据类型”


因此,是的,哈希表确实知道它们的“租户”。

因为a和b是相同的?但据我所知,哈希表只知道键而不是实际的键值,比如说a和b映射到键k,我认为哈希表只知道k而不是a和b。我错了吗?如果a和b是相同的,那就是碰撞。你是想问它是如何区分a/b和c的吗?在任何情况下,你的问题都是非常基本的,而且以前已经得到了回答。@delnan你是说如果a和b是相同的,那就是一个collison?是的,如果我使用哈希表,我想知道如何区分b/w a/b和cSo。。它需要多少内存。。我想需要的内存应该是HashTable Size()*整数大小。。。如果这是正确的,那么它在哪里存储租户呢?那么您是否认为哈希表存储了实际的键对象。。。。。我认为它只存储值..@user973931如果它只存储键,它将如何返回给定键的值?当然,它不能。@delnan它将计算散列并返回位于的值index@user973931因此它将存储该值;)@user973931,这不起作用,因为那样它就无法处理冲突。一个简单的hashtable实现将使用hashcode索引到的bucket有一个数组,然后每个索引存储另一个数组。查找的工作方式是转到给定hashcode的bucket,然后遍历数组,直到找到键,其中Equals使用传入的键返回true。