2011-11-23 2 views
1

별도의 연결을 충돌 해결로 사용하는 Java Map 인터페이스 구현이 있습니까? HashMap과 HashTable에 대한 javadocs를 읽음으로써 구현이하는 것은 기본적으로 값을 대체하고 본질적으로 충돌 해결을 사용하지 않는다는 결론에 도달 했습니까?별도의 체인이있는 Hashmap

+0

http://stackoverflow.com/questions/2756479/java-hashtable-with-seperate-chaining-collision-resolution – Manish

답변

4

틀렸어. 각 버킷에 연결된 항목 목록을 사용합니다.

지도에 값을 입력하면지도에서 키에 hashCode을 호출 한 다음이 해시 코드를 변환하여 0과 버킷 수 사이에 있도록합니다. 버킷이 비어 있으면 키가이 버킷에 저장됩니다. 그렇지 않은 경우이 버킷의 모든 키는 equals 인 새 키와 비교됩니다. 값이 같으면 값이 새 값으로 바뀝니다. 그렇지 않으면 새 키가있는 새 항목이 버킷의 항목 목록에 추가됩니다.

주어진 키에 대해 여러 값을 저장하려면 Map<Key, List<Value>>을 사용하거나 구아바의 MultiMap을 사용하십시오.

+0

소스를 살펴 봅니다. 예, 링크 된 목록을 사용합니다. 그러나 TREEIFY_THRESHOLD가 있다는 점에 유의할 필요가 있습니다. 버킷이 초과되면 연결 목록이 빨간색 - 검정색 트리로 변환됩니다. – manyways

3

충돌 해결 기능이 있지만 두 개의 다른 키가 해싱 후 동일한 버킷에있을 수 있기 때문입니다.

단일 키에 둘 이상의 값을 저장하려는 경우 항상 HashMap<KeyType, ArrayList<ValueType>>을 사용하고 필요에 따라 정리 작업을 수행하여 배열을 초기화 할 수 있습니다.

+1

의 가능한 중복 Guava의 ListMultimap을 확인하십시오. 'Map >'을 구현합니다. http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/com/google/common/collect/ListMultimap.html –

+0

좋은 지적입니다. 감사. 나는 다음 프로젝트 (들)을 염두에 두겠다. – Vlad