Why not compare e.key directly instead of assigning it to a variable?(为什么不直接比较 e.key 而不是将其分配给变量?)
问题描述
在阅读HashMap
的源代码时,我在public V put(K key, V value)
中看到了这个片段:
While reading the source code for HashMap
, I came across this snippet in public V put(K key, V value)
:
为什么要将 e.key
分配给 k
进行比较?为什么不直接比较,比如:
Why assign e.key
to k
for comparing? Why not compare directly, like:
-------- 更新 ------------
------------------- UPDATE ------------------------
根据@seand的回答,我做了更详细的调查:
According to the answer from @seand, I do more detail investigation:
类 Test 有一个 int 字段;
class Test has a int filed a;
使用 javap -c Main 获取类文件内容:
Using javap -c Main to get the class file content:
int a = t.a
表示
参考jvm规范获取[getfield的信息]
Refer to jvm specification get information of [getfield]
int b = a
表示:
访问局部变量似乎比访问类字段更合理.
It seems reasonable to access the local variable than the class field.
推荐答案
我猜这是一种优化,可以节省对 e.key 的额外查找.(虽然它实际上不是使用invokevirtual 的方法调用,但它可以节省一定程度的间接性).由于这是一个使用非常频繁的库函数,作者可能会使用他们能想到的所有技巧来获得最大性能.您还可以看到它如何在 k = e.key
中检查对象身份,这可以避免成本稍高的 equals()
调用.
My guess is it's an optimization which saves an extra lookup to e.key. (Though it's not actually a method call that's using invokevirtual, it may save a level of indirection). Since this is a very heavily used library function the authors likely used every trick they could think of for maximum performance. You can also see how it checks for object identity in k = e.key
which may avoid a slightly more costly equals()
call.
这篇关于为什么不直接比较 e.key 而不是将其分配给变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!