java - 为什么HashMap的get()在Java中会同时比较hash值和key?

标签 java hashmap comparison hashcode

我在看 JDK8 中 HashMap 的实现。在 get 方法中,我看到下面一行用于查找与给定键匹配的节点。

if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))

为什么需要将哈希值与 key 进行比较?为什么上面的行不写成:

if (((k = e.key) == key) || (key != null && key.equals(k)))

有没有解释为什么这样做?谢谢。

最佳答案

引起您困惑的似乎是两件事:

<强>1。比较哈希值(通常非常)比直接比较键快。

<强>2。在 == 运算符中,如果第一个条件为假,则不会检查第二个条件。

所以首先比较哈希值,这是很快的:

  • 当它们不相等时,您知道 key 也不相等,您就完成了。

  • 当它们相等时,您不知道键是否也相等,因此您必须比较键,这(相对)慢。

由于大多数键不相等,因此大多数时候您只比较哈希值。只有当键相等时(或由于哈希冲突导致哈希值相等时)您才会比较键,这种情况很少见,因此您可以获得性能优势。

关于java - 为什么HashMap的get()在Java中会同时比较hash值和key?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705292/

相关文章:

java - Spring @RequestMapping 日志消息?

arrays - 如何在 PowerShell 中比较两个 DataRow 对象数组?

python - 比较python中numpy数组的元素

opencv - 比较没有白色的直方图包括 OpenCV

Java swing - 重绘在重新调整大小时复制组件(JButtons 和 JLabels)

java - 使用一种布局并在 Eclipse 中以编程方式更改字符串

java - SunMSCAPI 不返回证书

java - 迭代HashMap并获取Object中值的 "Lowest"Integer

java - 访问 HashMap 中数组列表中的值并编辑该值

java - 无法从 sharedPreferences 检索 HashMap