为什么在HashMap中为getEntry定义对象

时间:2013-10-16 04:01:01

标签: java generics hashmap

我是仿制药的新手,我不确定我的问题的答案是opinion based还是有正当理由。在下面的代码中,需要设置一个对象条目的键?

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

似乎很容易被

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

更多参考资料:

 final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

4 个答案:

答案 0 :(得分:3)

这是一种极端优化措施,对于通用编程实践可能不是必需的。这是discussion可以回答您的问题。以下语句是从该帖子中复制的:

  

这是Doug Lea流行的编码风格。这是一种极端的优化,可能不是必需的;您可以期望JIT进行相同的优化。 (您可以尝试自己检查机器代码!)然而,复制到本地生成最小的字节码,对于低级代码,编写更接近机器的代码是很好的。

答案 1 :(得分:0)

您错过了keyk检查相等的最后一部分,因此删除作业(k = e.key)会打破最后一次检查 -

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

答案 2 :(得分:0)

如果你想要一个课程,你需要跳过篮球,你就可以。有了泛型,我总是很难让它变得有意义。有时它比你想象的更容易,有时你会尝试你能想到的一切。坚持下去。

答案 3 :(得分:0)

查看Entry的代码,key是“final”。我的看法是这段代码是从最终变量创建一个非final变量,这样最终变量的约束不会阻止后续代码的执行。除此之外,我还假设您已经说过“if”条件应该是相同的。