2014-11-13 2 views
0
public V put(K key, V value) { 
    if (table == EMPTY_TABLE) { 
     inflateTable(threshold); 
    } 
    if (key == null) 
     return putForNullKey(value); 
    int hash = hash(key); 
    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; 
} 

HashMap 구현을 이해하려고합니다. 나는이 선을 제외하고 모두를 이해했다 - 목표 k;
이 오브젝트 k가 어떻게 나타나는지 설명하십시오.오브젝트 k 란 무엇입니까?

+1

귀하의 혼란을 이해하지 못합니다. 그것은 누군가가 거기에 그것을 선언했기 때문에 나타납니다. 이해가 안되는 것은 무엇입니까? –

+0

'Object k'는 genric type'K key'와 관련이 없습니다. 그것은'Object foo'라는 이름이 될 수 있고 코드는 여전히 똑같은 것을 할 것입니다 – ortis

+0

k가 여기에 사용됩니다 : (k = e.key) == 키. 개체가 참조 평등한지 확인하는 일종의 복싱 인 것처럼 보입니다 (키 유형이 'K'(기본 키 유형)이 기본 유형 인 경우 상자에 표시되고 참조 평등이 아니므로 false를 반환 함). 그러나 둘 다 원시 타입이 아닌 경우 두 객체가 동일한 참조인지 확인합니다. 나중에 key.equals (k) 평등 검사를하므로 잠재적 인 호출을하지 않는 것을 확인하는 성능 검사 일뿐입니다 값 비싼 .equals() 메소드가 키가 같은 객체 인 경우 – kha

답변

1

HashMap의 구현에서 데이터 구조는 연결된 항목 목록의 배열로 뒷받침되었습니다. 이러한 항목에는 키와 값이 있습니다.

해당 변수 k은 연결된 목록 버킷을 반복하면서 각 항목의 키를 저장하는 데 사용됩니다. 값을 삽입하려는 키와 동일한 키 (참조 및 값 평등)가 있으면 해당 값이 이전 값을 대체합니다.

관련 문제