在java hashmap实现键中首先分配给对象然后进行比较

时间:2015-04-27 06:56:24

标签: java hashmap

查看java的hashmap实现,无法理解某些行背后的原因。在下面从here复制的代码中,在365-367行中,我无法理解为什么他们首先将e.key赋值给k然后将==与key [(k = e.key)进行比较)==密钥]。为什么不直接做(e.key == key)。这种模式在代码中出现了好几次。

359 
360     final Entry<K,V> getEntry(Object key) {
361         int hash = (key == null) ? 0 : hash(key.hashCode());
362         for (Entry<K,V> e = table[indexFor(hash, table.length)];
363              e != null;
364              e = e.next) {
365             Object k;
366             if (e.hash == hash &&
367                 ((k = e.key) == key || (key != null && key.equals(k))))
368                 return e;
369         }
370         return null;
371     }

2 个答案:

答案 0 :(得分:2)

这可能是优化问题。调用e.key会增加一个间接级别(当您使用e上的引用来获取key上的引用时)。变量k允许e.key具有快捷方式,并避免两次使用此不必要的间接。 该实现还直接使用分配k = e.key的结果,而不是将值分配给k,然后将kkey进行比较。

我不知道这种优化的影响是否显着(分配新变量与间接访问)。评估它可能很棘手,它可能依赖于JVM(因为不同的JVM可能会对代码执行不同的优化)。

由于HashMap在Java中被广泛使用,我想这个实现旨在提供最大的性能,而不期望从执行环境中进行任何优化;因此,这种模式的共同使用。

答案 1 :(得分:0)

我认为@ marco13发布了回答这个问题的正确链接。只需再次发布链接。 Why is lock captured to a local variable

In ArrayBlockingQueue, why copy final member field into local final variable?

Why jdk code style uses a variable assignment and read on the same line - eg. (i=2) < max

答案:使用成员变量的函数本地引用减少了生成的字节代码的大小。