首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java HashMap put()实现。为什么不先检查一下参考资料呢?

Java HashMap put()实现。为什么不先检查一下参考资料呢?
EN

Stack Overflow用户
提问于 2014-06-16 19:52:28
回答 2查看 368关注 0票数 13

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

代码语言:javascript
复制
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
    V oldValue = e.value;
    e.value = value;
    e.recordAccess(this);
    return oldValue;
}

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

例如,类似于以下内容:

代码语言:javascript
复制
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
}

这不是可以保存一个比较吗?

EN

Stack Overflow用户

发布于 2014-06-16 21:21:10

我不知道为什么,但一个天真的微基准测试表明,在Oracle的VM (Intel,32或64位)上,比较两个引用所需的时间大约是比较两个int(如在散列代码中)的时间的四倍。我会假设比较两个32位整数和两个地址指针在现代硬件上应该有类似的运行时成本,但我可能只是在这里没有考虑到一些显而易见的东西。

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

用于基准测试的方法:

代码语言:javascript
复制
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;
}
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24243092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档