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

Java 为什么在HashMap中为getEntry定义对象,java,generics,hashmap,Java,Generics,Hashmap,我是泛型新手,我不确定我的问题的答案是基于意见的还是有真正的原因的。在下面的代码中,需要什么来设置对象项的键 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.equa

我是泛型新手,我不确定我的问题的答案是基于意见的还是有真正的原因的。在下面的代码中,需要什么来设置对象项的键

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;
    }
final Entry getEntry(对象键){
int hash=(key==null)?0:hash(key);
for(条目e=表[indexFor(hash,table.length)];
e!=null;
e=e.next){
对象k;
如果(e.hash==hash&((k=e.key)==key | |(key!=null&&key.equals(k)))
返回e;
}
返回null;
}

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


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

如果你想对一个类做的事情需要你跳转,你可以这样做。对于泛型,我一直很难让它有意义。有时候结果比你想象的要容易,有时候你会想尽一切办法。继续。查看输入代码,键为“final”。我认为这段代码是从最终变量创建一个非最终变量,这样最终变量的约束就不会阻止后续代码的执行。除此之外,我还假设正如您所说的,两个“if”条件应该是相同的。

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

这是Doug Lea流行的一种编码风格。这是一个极端的优化,可能是不必要的;您可以期望JIT进行同样的优化。(你可以试着自己检查机器代码!)然而,复制到本地会产生最小的字节码,对于低级代码,编写稍微靠近机器的代码是很好的


我不是在考虑删除分配给k的任务。我是在考虑根本不使用k。