热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么我们需要检查哈希码两次?[重复]-Whydoweneedtocheckhashcodetwice?[duplicate]

Thisquestionalreadyhasananswerhere:这个问题在这里已有答案:Dokeyswithdifferenthashesalso

This question already has an answer here:

这个问题在这里已有答案:

  • Do keys with different hashes also get mapped to the same index in HashMap? 3 answers
  • 具有不同哈希值的键是否也映射到HashMap中的相同索引? 3个答案

This is the code of HashMap.java (docjar). Hash for key is calculated on line 431. This helps to fetch the index i on line 432. This all the entries at that index should have the same hash. Why is the check for hash equality made again on line 440 ? (if (e.hash == hash )

这是HashMap.java(docjar)的代码。密钥的哈希值在第431行计算。这有助于在第432行获取索引i。该索引处的所有条目应具有相同的哈希值。为什么在第440行再次检查哈希等式? (if(e.hash == hash)

private void putForCreate(K key, V value) {
  430           int hash = (key == null) ? 0 : hash(key.hashCode());
  431           int i = indexFor(hash, table.length);
  432   
  433           /**
  434            * Look for preexisting entry for key.  This will never happen for
  435            * clone or deserialize.  It will only happen for construction if the
  436            * input Map is a sorted map whose ordering is inconsistent w/ equals.
  437            */
  438           for (Entry e = table[i]; e != null; e = e.next) {
  439               Object k;
  440               if (e.hash == hash &&
  441                   ((k = e.key) == key || (key != null && key.equals(k)))) {
  442                   e.value = value;
  443                   return;
  444               }
  445           }
  446   
  447           createEntry(hash, key, value, i);
  448       }

1 个解决方案

#1


3  

The same bucket may contain entries whose keys have different hash codes (since the bucket index i is determined by applying modulus table.length on the computed hash, so different hash codes may be mapped to the same bucket), so the comparison in line 440 saves you the need to call equals for the two keys that don't have the same hash code, which would normally be more expensive than comparing two ints.

同一个桶可能包含其密钥具有不同哈希码的条目(因为桶索引i是通过对计算的哈希应用模数table.length来确定的,因此不同的哈希码可以映射到同一个桶),因此行440中的比较节省了为不具有相同哈希码的两个键调用equals的需要,这通常比比较两个int更昂贵。


推荐阅读
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 在工作中,遇到需要将excel表中的特定数据提取出来,并将数据以键值对的形式存储到map集合中。因为我用的是maven管理的jar包,所 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
  • 一、equals方法的作用1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Objec ... [详细]
  • 案例packagecn.itcast_02;importjava.util.HashSet;**需求:存储自定义对象,并保证元素的唯一性* ... [详细]
  • 探索equals()和hashCode()方法  在根类Object中,实现了equals()和hashCode()这两个方法,默认:  equals()是对两个对象的地址值进行的比较(即比较引用是否 ... [详细]
author-avatar
我爱盘小静永远永远
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有