2014-09-04 4 views
1

Исходный код java.util.HashMap#put(Object, Object) являетсяJava метод HashMap .Put()

public V put(K key, V value) { 

    if (key == null) 
     return putForNullKey(value); 
    int hash = hash(key.hashCode()); 
    int i = indexFor(hash, table.length); 
    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; 
     } 
    } 

    modCount++; 
    addEntry(hash, key, value, i); 
    return null; 
} 

Я думаю, что если ключи можно получить тот же индекс в таблице (например: key1 и key2 все в таблице [х ]), e.hash == hash всегда будет возвращать true. Является ли код e.hash == hash необходимым для метода .put()?

Единственное объяснение заключается в том, что при использовании метода hash() ив качестве ключа key.hashCode() результат может быть таким же, поэтому код будет необходим.

Является ли мой ответ правильным? Кто может мне сказать, нужен ли e.hash == hash?

+0

Непонятно, в чем проблема. Можете ли вы попытаться немного разобраться. –

+0

e.hash! = Hash может случиться? – pccold

ответ

0

e.hash == hash - это просто оптимизация; это не обязательно. Вы уже сравниваете элементы в одном и том же хэш-ведре, и если два элемента: .equals, они совпадают. Единственным моментом является минимизация дорогих .equals проверок элементов, хэш которых совпадает с размером хэш-таблицы.

+0

e.hash! = Hash может случиться? – pccold

+0

Несомненно, если два хэша имеют одинаковый размер хэш-таблицы. –

Смежные вопросы