2010-09-08 2 views
12

HashMap에서 키로 설정하려는 클래스가 있습니다. 이미 해당 클래스에 대해 compareTo 메서드를 구현했습니다. 하지만 여전히 내가 할 때 :java 해시 맵에서 키를 자체 클래스로 설정

 
map.put(new MyKey(dummyArguements) , dummyValue); 
System.out.println(map.get(new MyKey(dummyArguements))); 

null가 반환됩니다. 그래서 hashmap은 두 개의 키 (get & put 호출)가 동일하다는 것을 식별 할 수 없다는 것을 의미합니다.

누군가 나를 도와 줄 수 있습니까?

답변

32

hashCode()equals()을 구현해야합니다. compareTo()은 추가로 정렬 된지도/세트에 필요합니다.

자세한 내용은 this question을 참조하십시오.

+1

나는 무례 함을 느끼지 않으며 (사실 일 것으로 생각하지 않습니다.) ** ** 어떻게 **이 사실을 알고 계십니까? 나는 [HashMap 문서] (http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html)를 계속 읽고있다. 인터페이스와 상속 .... 다음과 같이 원격에서'HashMap'으로 제대로 작동하기 위해서는 위에서 언급 한 메소드를 구현하거나 오버라이드 할 필요가 없다. –

+0

Map 인터페이스의 일부 메소드 정의는 일부 규칙을 설정합니다. 예를 들어 containsKey()는 특히 equals()를 언급합니다.Object에 대한 hashCode() 설명서는 equals()와 equals() 사이의 관계를 지정합니다. 그러나 나는 당신의 요점에 동의한다 - HashMap 문서는 hashCode() 메서드를 참조하고 HashMap의 키에 대한 사용/요구 사항을 문서화해야한다. –

+0

또한 클래스는 '불변'이어야합니다. – Sadegh

3

1) 일반적으로 컬렉션에 대해, 당신이 재정의하고자하는 것은 클래스의 equals() 메소드 (그리고 hashcode() 메소드)입니다. compareTo()/Comparable 및 Comparator는 일반적으로 정렬에 사용되며 일부 경우 Object equivalance에 equals() 메서드를 사용하는 대신 처리됩니다. 예는 TreeSet과 같은 SortedSet의 구현 자입니다.

2) 코드에서 Java 명명 표준을 준수하십시오. 수업 이름은 대문자로 입력해야합니다 (예 : new MyKey(dummyArguments)). 자세한 내용은 http://www.oracle.com/technetwork/java/codeconventions-135099.html#367 (및 http://www.oracle.com/technetwork/java/codeconvtoc-136057.html)을 참조하십시오.

+0

클래스의 이름이 바뀌 었습니다. 지적 해 주셔서 고마워요. :) –

0

hashCode()이 정의되어 있습니까? 정렬에는 compareTo이 필요합니다.

0

HashMapcompareTo()을 확인하지 않습니다.

HashMaphashCode()equals()을 확인하십시오.

12

equals()hashCode()을 구현해야합니다. 수업도 변경 가능해야합니다. 그것은 변경할 수있는 경우 해시 코드를 매핑에 추가 한 후 변경할 수 있습니다. 그런 다음지도에 문제가있을 수 있습니다.

+3

+1 용 불가분 – helios

+0

그는'put'과'add' 전에 ​​새로운 것을하고 있습니다. 그래서 불변은 중요하지 않습니다. 여전히 좋은 점, +1. – fastcodejava

0

맵 및 세트와 같은 해시를 사용하는 컬렉션을 사용할 때 올바른 기능을 보장하려면 equals()hashCode()을 구현해야합니다. 그렇지 않은 경우, 새 구현 키는 기본 구현 인 equals()hashCode()을 사용하기 때문에 항상 맵에 저장된 키와 다릅니다.

0

equals() 및 hashCode()를 구현해야합니다. 수업도 변경 가능해야합니다. 그것은 변경할 수있는 경우 해시 코드를 매핑에 추가 한 후 변경할 수 있습니다. 그런 다음지도에 문제가있을 수 있습니다.

0

java8의 경우, 해시 충돌 수가 11을 초과하면 HashMap이 항목을 이진 트리에 저장하므로 Comparable (compareTo 추가)도 구현해야합니다. 그렇지 않으면 성능이 저하됩니다.

관련 문제