2010-07-27 2 views
3

의 HashMap 내가 해시 테이블의 초기 크기를 가지며, 아직 넣어 다양한 호출 (이후 증가 얻을 수 이해되는 값HashMap의 구현 문제

을 길게 배열)는 해시 테이블을 포함하는 (의존 로드 - 팩터에)

아무튼 나는 해시 테이블의 크기를 변경 한 후에 값을 찾을 수 있을지 궁금해하기 때문에 특정 키의 코드를 가지고 있기 때문에 계산할 수 있습니다. 표

예 : 키 * 프라임 % 크기

어떻게 작동합니까?

답변

3

Visage는 일반적으로 키에서 계산 된 해시 값을지도의 실제 크기를 모듈로 확산하여 버킷에 매핑하고지도의 크기가 조정되면 모든 요소가 다시 확산됩니다. 버킷의 새로운 범위.

그러나 Java 1.4부터는 커튼 뒤에서 일어날 일이 몇 가지 있습니다. 우선 전통적인 해시 맵에서 크기는 이상적인 소수입니다. 이는 버킷 범위 전체에 요소를보다 균등하게 분산시키는 데 도움이되기 때문입니다. 그러나 Java 1.4 HashMap에서 크기는 항상 2의 제곱입니다. 이렇게하면 표준 배포가 매우 나 빠지게됩니다. 그러나이 구현에서 해시 값은 내부적으로 매우 빠른 알고리즘을 사용하여 배포를 원활하게합니다.

자세한 내용은 Java Specialist Newsletters 5454b에서 확인하십시오.

2

키는 일반적으로 값이 입력 된 저장소를 찾는 데 사용되기 때문에 사용됩니다. 모든 개체가 새 크기에 따라 새 저장소로 다시 할당되기 때문에 재 할당이 영향을 미치지 않습니다. 당신이 addEntry(..) 방법의 코드를 보면

+0

아, 크기를 늘린 후에 모든 값을 검토하고 다시 할당한다고 말했습니까? –

+0

아니요, HashMap 구현이 있습니다. – PaulJWilliams

+0

그것이 내가 의미했던 것이 었습니다. 좋은 감사합니다! –

2

, 당신은 참조하십시오

크기 조정에
if (size++ >= threshold) 
    resize(2 * table.length); 

에서, transfer(..) 메서드가 호출되고, 어떤 : newTable에 현재 테이블에서

전송 모든 항목 .

+0

질문에 어떻게 대답합니까? –

+0

마지막 부분 (처음 몇 초 후에 추가됨)이 부분적으로 발생합니다. – Bozho

+0

알았어, 좋아. –