Читая исходный код для 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];
Кажется разумным получить доступ к локальной переменной, чем поле класса.