【问题标题】:in java hashmap implementation key is first assigned to object and then compared在 java hashmap 实现中,键首先分配给对象,然后进行比较
【发布时间】:2015-04-27 06:56:23
【问题描述】:

查看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     }

【问题讨论】:

标签: java hashmap


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我认为@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

    答案:使用成员变量的函数局部引用可以减少生成的字节码大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2017-05-26
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多