当前位置: 首页 > 面试题库 >

Java HashMap如何处理具有相同散列代码的不同对象?

韶镜
2023-03-14
问题内容

根据我的理解,我认为:

  1. 两个对象具有相同的哈希码是完全合法的。
  2. 如果两个对象相等(使用equals()方法),则它们具有相同的哈希码。
  3. 如果两个对象不相等,则它们不能具有相同的哈希码
    我对么?

现在,如果正确,我将遇到以下问题:HashMap内部使用对象的哈希码。因此,如果两个对象可以具有相同的哈希码,那么如何HashMap跟踪它使用的键?

有人可以解释HashMap内部如何使用对象的哈希码吗?


问题答案:

哈希图的工作方式如下(这有点简化,但是它说明了基本机制):

它具有多个“存储桶”,用于存储键值对。每个存储桶都有一个唯一的数字-标识存储桶。将键值对放入地图时,哈希图将查看键的哈希码,并将该对存储在其标识符为键的哈希码的存储桶中。例如:密钥的哈希码为235->该对存储在存储区号235中。(请注意,一个存储区可以存储多于一个键值对)。

当你在哈希图中查找值时,通过为其提供键,它将首先查看你提供的键的哈希码。哈希图随后将查看相应的存储桶,然后将你提供的密钥与存储桶中所有对的密钥进行比较,方法是将它们与进行比较equals()

现在,你将看到如何在映射中查找键值对非常有效:通过键的哈希码,hashmap可以立即知道要在哪个存储桶中查找,因此只需要针对该存储桶中的内容进行测试。

查看上述机制,你还可以看到对键hashCode()equals()方法有什么要求:

  • 如果两个键相同(在比较它们时equals()返回true),则它们的hashCode()方法必须返回相同的数字。如果键违反了此规则,那么相等的键可能会存储在不同的存储桶中,并且哈希图将无法找到键值对(因为它将在同一存储桶中查找)。

  • 如果两个键不同,那么它们的哈希码是否相同也没关系。如果它们的哈希码相同,它们将存储在相同的存储桶中,在这种情况下,哈希图将用于equals()区分它们。



 类似资料:
  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • } 我有两个相同的对象,但是它们有不同的hashCode。为什么呢?我尝试覆盖Rational中的. equ方法r1.equals(r2)==true。但是它们仍然产生不同JavahashCode。

  • 问题内容: 根据我的理解,我认为: 两个对象具有相同的哈希码是完全合法的。 如果两个对象相等(使用equals()方法),则它们具有相同的哈希码。 如果两个对象不相等,则它们不能具有相同的哈希码 我对么? 现在,如果正确的话,我有以下问题:HashMap内部使用对象的哈希码。因此,如果两个对象可以具有相同的哈希码,那么如何HashMap跟踪它使用的键? 有人可以解释HashMap内部如何使用对象的

  • 问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一

  • 我有一个PDF文件,其中包含一个表单,其中的字段具有相同的字段名。这是为了共享文档中的数据而做的。例如,我有合同,此文档的每一页都必须有公司名称,我将公司名称写在一个表单字段中,并将其复制到当前文档的所有页面,但是当我尝试使用库阅读此文档时,我没有得到此数据,因为只创建一个字段名为的字段,而另一个字段名为clean。 如何使用库读取具有相同字段名称的字段?

  • 问题内容: 在以下代码中,我不明白为什么当它属于两个不同的对象时具有相同的ID? 问题答案: 我认为这是正在发生的事情: 取消引用时,将在内存中创建其副本。该存储位置由以下位置返回 由于没有引用到刚刚创建的方法的副本,因此GC将其回收,并且该内存地址再次可用 取消引用时,将在相同的内存地址(可用)中创建它的副本,您可以再次使用该地址。 第二个副本是GCd 如果您要运行一堆其他代码并再次检查实例方法