Почему бы не сравнить e.key напрямую, а не назначить его переменной?

Читая исходный код для HashMap, я наткнулся на этот фрагмент в public V put(K key, V value):

for (Entry<K,V> e = table[i]; e != null; e = e.next) {
    Object k;
    if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
        V oldValue = e.value;
        e.value = value;
        e.recordAccess(this);
        return oldValue;
    }
}

Зачем присваивать e.key to k для сравнения? Почему бы не сравнить напрямую, например:

if (e.hash == hash && (e.key == key || key.equals(e.key))

------------------- UPDATE ------------------------

В соответствии с ответом от @seand, я делаю более подробное исследование:

import com.test.Test;

    public class Main {
        public static void main(String[] args) {
            Test t = new Test();
            int a = t.a;
            int b = a;
        }
    }

Класс Test имеет int, зарегистрированный a;

Использование javap -c Main для получения содержимого файла класса:

  public static void main(java.lang.String[]);
Code:
   0: new           #2                  // class test/Test
   3: dup           
   4: invokespecial #3                  // Method test/Test."<init>":()V
   7: astore_1      
   8: aload_1       
   9: getfield      #4                  // Field test/Test.a:I
  12: istore_2      
  13: iload_2       
  14: istore_3      
  15: return    

int a = t.a представляет

8:[load the t object]
9:[access the field a]
12:[store the value to a]

Обратитесь к jvm specification, чтобы получить информацию о [getfield]

int b = a представляет:

13:[load the local variable]
14:[store the value to b];

Кажется разумным получить доступ к локальной переменной, чем поле класса.

Ответ 1

Мое предположение - это оптимизация, которая экономит дополнительный поиск e.key. (Хотя на самом деле это не вызов метода, который использует invokevirtual, он может сэкономить уровень косвенности). Поскольку это очень сильно используемая функция библиотеки, авторы, вероятно, использовали каждый трюк, который они могли придумать для максимальной производительности. Вы также можете увидеть, как он проверяет идентификатор объекта в k = e.key, который может избежать немного более дорогого вызова equals().