해시맵의 해시코드.

3279 단어 HashMapHashCode
해시코드가 잘 이해가 안 돼서 오늘 자세히 봤어요.
코드를 먼저 부착합니다.
HashMap map = new HashMap();
map.put("ab", 1);
map.put("2", 2);

System.out.println("map.hashcode:"+map.hashCode());
출력 결과map.hashcode:3152입니다. 이제 알겠습니다. 저희가 정의한 맵의 해시 값은 3152입니다.이 결과는 어떻게 계산해 냈습니까?
먼저 hashCode 를 실행하는 방법을 살펴보겠습니다.
    public int hashCode() {
        int h = 0;
        Iterator<Entry<K,V>> i = entrySet().iterator();
        while (i.hasNext())
            h += i.next().hashCode();
        return h;
    }
즉, entrySet의 모든hashCode를 가져오면 맵의hashCode를 얻을 수 있다.
이 entrySet의 코드는 계속 붙입니다.
public Set<Map.Entry<K,V>> entrySet() {
    return entrySet0();
}

private Set<Map.Entry<K,V>> entrySet0() {
    Set<Map.Entry<K,V>> es = entrySet;
    return es != null ? es : (entrySet = new EntrySet());
}
이 맵의 엔트리 집합을 가져오는 겁니다.
이 단계에서 요약하면 다음과 같다. 하나의 맵의 해시 값을 얻는 것은 맵의 모든 Entry를 얻는 것이다. 모든 Entry의 해시 값을 구하고 더하면 된다.
계속해서 Entry 정의를 봅니다.Map 클래스에서
interface Entry<K,V> {
    K getKey();
    V getValue();
    V setValue(V value);
    boolean equals(Object o);
    int hashCode();
}
HashMap 클래스에서 다음을 수행합니다.
static class Entry<K,V> implements Map.Entry<K,V> {
  /** . . .         */
  public final int hashCode() {
          return (key==null   ? 0 : key.hashCode()) ^
                 (value==null ? 0 : value.hashCode());
      }
}
자, 엔트리마다hashCode는 어떻게 계산합니까?키의 해시코드가 다르거나 value의 해시코드입니다.
자, 이제 아까의 예로 돌아가겠습니다.맵의 해시 값은 무엇입니까?
"ab".hashCode()^1.hashCode()
+
"2".hashCode^2.hashCode()
String과 Integer의 hashcode 방법에 관해서는 붙이지 않겠습니다. 위의 값을 책임감 있게 말씀드리겠습니다.
0b 110000100001 ^ 0b 1 + 0b 110010 ^ 0b 10 = 0b 110000100000 + 0b 110000 = 3104 + 48 = 3152
드디어 계산이 나왔다.
해시의 장점에 관해서는 며칠 후에 다시 이야기하자.

좋은 웹페이지 즐겨찾기