1

我是仿制药新手,我不确定我的问题的答案是否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

4 回答 4

3

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

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

于 2013-10-16T05:42:09.120 回答
0

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

于 2013-10-16T05:03:23.173 回答
0

如果您想对课程做的事情需要您跳过篮球,那么您可以做到。对于泛型,我一直很难让它变得有意义。有时它比你想象的更容易,有时你会尝试你能想到的一切。坚持下去。

于 2013-10-16T04:29:15.720 回答
0

您错过了key检查与 是否相等的最后一部分k,因此删除分配(k = e.key)将破坏最后一次检查 -

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

于 2013-10-16T04:18:10.237 回答