Java 为什么在HashMap.put()中以奇怪的方式比较键?
在浏览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
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))