2014-09-04 3 views
1
java.util.HashMap#put(Object, Object)의 소스 코드는

자바 해시 맵 방법 .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; 
} 

내가 키가 (표에 같은 인덱스를 얻을 수있는 경우라고 생각입니다

]), e.hash == hash은 항상 true를 반환합니다. 코드 e.hash == hash.put() 방법에 필요합니까?

유일한 설명은 hash()indexFor() 메서드가 작동 한 후에 다른 key.hashCode()가 결과가 같아 지므로 코드가 필요하다는 것입니다.

내 대답은 맞습니까? e.hash == hash이 필요한 경우 누가 알 수 있습니까?

+0

문제가 무엇인지는 명확하지 않습니다. 좀 더 정교하게 만들 수 있습니까? –

+0

e.hash! = 해시가 발생할 수 있습니까? – pccold

답변

0

은 최적화에 지나지 않습니다. 그것은 꼭 필요한 것은 아닙니다. 이미 동일한 해시 버킷에있는 요소를 비교하고 있고 두 개의 요소가 .equals이면 일치합니다. 유일한 포인트는 값 비싼 .equals 해시 테이블 크기와 동일한 해시를 가진 요소를 확인하는 것입니다.

+0

e.hash! = 해시가 발생할 수 있습니까? – pccold

+0

물론 두 해시가 같은 mod 인 경우 해시 테이블 크기가 맞습니다. –