gpt4 book ai didi

Java HashMap put() 实现。为什么不先检查引用文献?

转载 作者:搜寻专家 更新时间:2023-10-30 20:54:03 24 4
gpt4 key购买 nike

java.util.HashMap有一个 put 方法的实现,它有 the following code inside it :

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}

在上面的代码中,为什么不首先进行引用检查(因为具有相同引用的两个对象将具有相同的散列和 equals())?

即像这样:

if ((k = e.key) == key) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
} else if ( compare hash and equals) {
// do something again with the value
}

这不会保存比较吗?

最佳答案

我不知道为什么,但一个简单的微基准测试表明,在 Oracle 的 VM(英特尔,32 位或 64 位)上,比较两个引用所花的时间大约是比较两个整数(如哈希码)的四倍。我本以为比较两个 32 位整数和两个地址指针在现代硬件上应该具有相似的运行时成本,但我可能只是没有考虑这里明显的事情。

假设在大多数情况下不同的 key 具有不同的哈希码,比较 key 之前的哈希可以为每个错误的 key 节省 75% 的运行时间,并为正确的 key 增加 25% 的运行时间。这是否真的节省了总体运行时间当然取决于 HashMap 表的确切内容和布局,但 Sun 工程师显然认为这种变体对于大多数用途来说更好。

用于基准测试的方法:

public static int c1(int a, int b, int iter) {
int r = 0;
while((iter--)>0) {
if(a == b) {
r++;
}
}
return r;
}

public static int c2(Object a, Object b, int iter) {
int r = 0;
while((iter--)>0) {
if(a == b) {
r++;
}
}
return r;
}

关于Java HashMap put() 实现。为什么不先检查引用文献?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24243092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com