2016-10-14 8 views
5

자바 7의 HashMap 구현 소스 코드 (get() 메쏘드)는 다음과 같다. 보다시피 get 메소드에서 키를 비교할 때 키는 'hashcodes와 keys'값을 비교하여 연결 목록의 항목이 검색중인 키인지 확인합니다. 그러나 두 개의 키가 같은 경우에는 물론 동일한 해시 코드를 가지며 두 개의 키가 다른 경우 키 값을 비교하면 키를 구분하는 데 충분합니다. 그렇다면 Java HashMap 소스 코드가 키의 해시 코드를 동일하게 취급하는 이유는 무엇입니까?해시 맵 키의 비교, 왜 키의 해시 코드와 키의 값을 비교할 것인가?

public V get(Object key) { 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

답변

8

테스트 ==int 평등에 대한 복잡한 객체에 equals를 호출에 비해 상당히 저렴 작업입니다. 해시의 평등은 지름길입니다. 키가 전혀 없으면 해시가 동일하지 않으며 false을 반환하는 비교적 빠른 ==은 (단락 논리 덕분에) equals 작업을 실행하는 것을 절약합니다. 열쇠가 있다면, 다른 빠른 평등을 "낭비"했습니다.