: http://www.docjar.com/html/api/java/util/HashMap.java.html 난 다음주의 :자바의 HashMap 구현 해시 문제
가사용되는 내부 데이터 구조는 배열을하는 각 인덱스의 저장에 연결된 첫 번째 항목에 대한 참조 명부. 배열 인덱스는 키의 해시 코드를 기반으로하며 링크 된 목록은 특정 해시 코드의 버킷을 나타냅니다. 흥미로운 것은 indexFor (int h, int length) 메서드입니다. 주어진 키에 대해 배열의 어떤 버킷을 볼지를 결정합니다. 그러나 구현시 반환 값은 & (길이 - 1)입니다. 지정된 배열 인덱스와 일치하지 않는 불확실한 수의 해시 코드의 경우 메서드는 0을 반환합니다. 따라서 개체에 대해 구현 한 고유 한 해시 코드가 없더라도 배열의 0 양동이는 대부분 개체로 가득 차서 따라서 고유 한 해시 코드가 제공하는 것으로부터 이점을 얻지 못합니다. 즉, 빠른 데이터 액세스입니다.
내가 누락 된 항목이 있습니까?
크리스티안
그래, 그게 다야. 감사합니다. –
이번에는 해시 테이블 클래스와 관련된 또 다른 질문이 있습니다. 이 구현에서 http://www.docjar.com/html/api/java/util/Hashtable.java.html 배열의 버킷 인덱스는 key.hashcode % array.length를 사용하여 계산됩니다. 여기서 array.length는 2의 거듭 제곱이 아닙니다. 우리는 길이가 11 인 intial 배열을 가지고 hashcode = 1 인 키를 먼저 삽입하고, 배열 인덱스는 1이 될 것이고, hashcode = 12와 함께 또 다른 키를 삽입 할 것이므로 배열 인덱스도 1이 될 것입니다. 이것은 다른 해시 코드를 가진 2 개의 키에 대한 객체가 동일한 버킷에 저장된다는 것을 의미합니까? –
올바른 초기 값 (즉, 15)을 지정하면 크기 조정 공식'oldCapacity * 2 + 1'이 올바르게 유지됩니다. 프라임 번호는 이러한 경우의 일반적인 권장 사항이며 합리적으로 잘 작동합니다. 당신이 진절머리 나는 초기 크기를 지정하면 크기가 더 커질 것이다. 결국 완벽한 것은 아닙니다. 데이터 구조가 없습니다. 효율성에 대한 관심이 많다면 http://labs.carrotsearch.com/hppc.html을 확인해보십시오. 원하는대로 할 수있는 충분한 로프를 제공합니다 :-) – ddimitrov