2012-09-03 1 views
0

연락처 이름과 연락처와 연결된 전화 번호 목록 간의 연결에 java.util.HashMap을 사용하고 있으므로 String, List<String> 유형입니다. 그러나 Say key1에서와 똑같은 버킷으로 매핑 할 수있는 키가 두 개 이상있을 수 있습니다. < 1234,5678>은 해시 맵의 인덱스 2에 저장됩니다. 동일한 인덱스에 해시 할 수있는 또 다른 key2를 가질 수 있습니다. 따라서 key1은 < 1234,5678> key2로 대체됩니다 : < 7890,1456> ???? 또는 그것은 연결되어 key1과 key2가 모두 해당 색인에 저장됩니까?내 연락처 기반 Java 용 충돌 처리에 대한 설명

편집 : 아래 코드는 뉴 멕시코 만 반환합니다. 이제이 경우 두 사람 모두 동일한 해시 코드를 얻습니다. 그러면 충돌이 정확합니까? 이 경우 두 값을 연결해서는 안됩니까? 그러니 해시 코드가 2라고 말하면 저장 장치가 보이지 않아야합니다.지도의 2의 인덱스 (OR 배열)에 1-Mexico, 1-New mexico가 맞아야합니다. 따라서 반환 된 값은 멕시코와 뉴 멕시코의 값이어야합니다. 왜 여기에 묶여 있지 않는거야?

public static void main(String[] args) 
    { 
     Map<Integer,String> map = new HashMap<Integer,String>(); 
     map.put(1, "Mexico"); 
     map.put(1, "New Mexico"); 
     System.out.println(map.get(1)); 

    } 
+0

두 개의 키가 'HashMap'에서 동일한 해시 버킷에 매핑되면 사용자는이를 알 수 없습니다. 'HashMap'은 _all_ 키가 같은 버킷에 매핑되어 있어도 똑같이 작동합니다. 요약하면, 당신은 너무 많이 걱정하고 있습니다. –

답변

3

나는 귀하의 질문을 이해하고 있습니다.

표준 HashMap에서 동일한 값으로 다른 값을 넣으면 첫 번째 값을 바꿉니다.

그러나 아파치 commons의 MultiMap을 사용하여 키당 둘 이상의 값을 저장할 수 있습니다.

동일한 색인을 가진 두 개 이상의 키와 관련된 질문은 구현에 의해 처리됩니다. 키가 연결된 목록 (각 버킷마다 하나씩)에 저장되고 실제 비교 (equals 사용)가 수행됩니다. equals이 false를 반환하는 한 충돌을 일으키지 않도록 작업을 가져오고 넣습니다.

컬렉션 관련 문제와 마찬가지로, 자신의 클래스를 사용하려는 경우 중요한 것은 equalshashcode 메서드를 올바르게 구현하는 것입니다 (this 참조). 이것은 지정된 키를 가진 첫 번째 값이 새에 의해 삭제되는 HashMap의의 기능입니다

: 편집의 질문에 대해서는

. 따라서 "뉴 멕시코"를 추가하면 "멕시코"가 HashMap에서 제거됩니다.

주어진 키에 둘 이상의 값을 지정하려면 멀티 맵을 사용하거나 HashMap<Integer, List<String>>을 사용하지만 put 작업은 조금 지루합니다.

+0

제 질문은 다른 키가 동일한 버킷에 매핑되는지 여부에 대한 것이 었습니다. 그런 다음 원래의 키 - 값 쌍이 새 키 - 값 쌍으로 대체됩니까? – Phoenix

+0

두 개의 키가 동일한 버킷에 매핑되는 경우 멀티 맵은이 상황에서 어떤 작업을 수행합니까? – Phoenix

+0

당신은 무엇을 "양동이"라고 부릅니까? 용량이'capacity '인 배열입니까? –

2

이것은보다 신중하게 생각해야하는 디자인입니다. 제게는 Map을 사용하고 있습니다. String을 원시 형으로 사용하는 것은 이러한 방식으로 사용하는 것입니다. 이는 자신이 디자인 한 실제 추상 데이터 유형에 더 잘 부합하는 추상화에 대한 약한 근사치로 사용됩니다.

예를 들어, 연락처 이름 String은 내게 좋은 추상화로 느껴지지 않습니다. 전화 번호부에는 몇 개의 반복 된 이름이 있습니까? 솔루션이 단순하지 않은 크기 이상으로 커지면 충돌이 발생합니다.

그럼 Contact 클래스는 무엇입니까? 연관된 전화 번호의 StringList 이름을 잘 정리 된 equals와 hashCode를 사용하여 단일 객체에 캡슐화하십시오. 고유 ID 개인 회원을 지정하십시오. 그렇게 충돌하지 마라.그 수업을 사용하는 사람들은 당신이 성취하려는 것을 더 빨리 이해할 것입니다.

+0

하지만 연락처 개체는 다음과 매핑됩니다. 여기서 이름은 전화 번호 목록에 매핑됩니다. 연락처 개체를 키로 사용하면 값이 null이됩니까? – Phoenix

+0

키와 값이있는 맵은 없습니다. 당신은 Contacts of Collection을 가질 것입니다. 연락처가 Comparable을 구현하면 이름이 John Doe 인 List에서 모든 연락처를 추출 할 수 있습니다. 메서드는 연락처 목록을 반환합니다. – duffymo

+0

그럼이 경우에는 Arraylist를 사용하는 것이 낫지 않을까요? – Phoenix

0

아니요, 서로 다른 두 개의 키가 같은 값으로 해시되면 키가 연결되고 작동하는 동안 시스템은 실제 키와 동일하게 올바른 항목을 찾습니다.

hashCode()에 대해 단순히 1을 반환하는 퇴보 클래스를 만든 경우 HashMap은 여전히 ​​spec에서 작동하며 끔찍하게 수행되어 간단한 목록으로 돌아갑니다.