Java 为什么在HashMap.put()中以奇怪的方式比较键?

Java 为什么在HashMap.put()中以奇怪的方式比较键?,java,optimization,reference,hashmap,Java,Optimization,Reference,Hashmap,在浏览HashMap的put()代码时,我遇到了一段奇怪的代码。考虑下面的代码摘录: 490 public V put(K key, V value) { 491 if (table == EMPTY_TABLE) { 492 inflateTable(threshold); 493 } 494 if (key == null) 495 return putForNullKey(value); 496 int hash = hash(k

在浏览HashMap的put()代码时,我遇到了一段奇怪的代码。考虑下面的代码摘录:

490  public V put(K key, V value) {
491        if (table == EMPTY_TABLE) {
492            inflateTable(threshold);
493     }
494  if (key == null)
495   return putForNullKey(value);
496     int hash = hash(key);
497     int i = indexFor(hash, table.length);
498     for (Entry<K,V> e = table[i]; e != null; e = e.next) {
499         Object k;
500         if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
501             V oldValue = e.value;
502             e.value = value;
503             e.recordAccess(this);
504             return oldValue;
505         }
506     }


我不知道为什么它是这样写的,但我确信在它被如此编码的背后有一些原因。这是某种优化吗
有人能解释一下吗?

他们正在保存对象取消引用

(e.key == key || key.equals(e.key))
必须跟随e->键两次

以下是一次:

((k = e.key) == key || key.equals(k))
不过节省的空间很小,在现代编译器/优化器/etc中甚至可能根本没有节省。记住这个代码是很久以前写的,很可能是来自C++编程背景的人,这种东西更常见,更有用。 对于一个访问频率很高的类进行非常频繁的操作,这可能是有意义的。但在大多数情况下,这一微小的节省并不能弥补可读性的损失

((k = e.key) == key || key.equals(k))