2013-10-03 4 views
1

내 클래스 Cell을 키로 사용하여 HashMap을 사용하려고합니다. 다만, HashMap에 아이템을 넣으면 (자), 그 아이템에 contains를 호출하면 (자) false가 돌려 주어집니다. 맵 문서에 따라 containsKey이 .equals을 사용하기 때문에키 기반 값을 반환하지 않는 HashMap

public static void main(String args[]) { 
     HashMap<Cell, String> map = new HashMap<Cell, String>(); 
     map.put(new Cell(0,0), "Bob"); 
     System.out.println(map.containsKey(new Cell(0,0))); 
     System.out.println(new Cell(0,0).equals(new Cell(0,0))); 
} 

이, 그것은 사실과 진실 인쇄 할 위치, 거짓과 진실 출력한다(). 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

또는 equals, hashCode를 전혀 구현하지 마십시오. equals를 오버라이드 (override)하는 경우, hashCode도 구현해야한다. – Anton

+1

'hashCode()'를 오버라이드 (override)하지 않으면, 디폴트의 Object 메소드를 사용하므로 같은 값을 가지고 있어도 객체마다 다릅니다. –

답변

3

equals()hashCode()이 구현되어 있지 않기 때문일 가능성이 큽니다. Java에서, 경험적 규칙은 구현하는 경우 다른 것을 구현해야한다는 것입니다. 귀하의 경우에는 HashMap이 그들을 사용하기 때문에 필수입니다.

두 개의 개별 주소로 두 개의 개별 개체를 만들었습니다. 이러한 메소드가 없으면 JVM은 객체가 "동일"하다는 것을 알 수 없습니다.

당신은 제대로()`뿐만 아니라`해시 코드를 구현해야

1

HashMap이 어떻게 구현되는지 고려하십시오. 퍼팅 할 때 먼저 객체 hashCode()을 계산하여 객체를 배치 할 버킷을 찾습니다. 객체를 가져 오려고하면 다시 hashCode(), 대상 버킷을 식별하고 버킷의 연결된 목록을 통해 equals() 각 개체에 대해 일치하는 것을 찾으면 리턴합니다.

즉, HashMap을 사용할 때 equals()hashCode()의 정확하고 일치하는 구현이 필요합니다.

Object에서 상속 된 hashCode() 메서드는 개체 참조가 동일하지 않으면 hashCode()을 올바르게 반환하지 않습니다. 귀하의 경우에는 그렇지 않습니다.

0

새 Cell (0,0)을 여러 번 호출하면 다른 해시 코드로 여러 객체가 생성됩니다. Cell 클래스의 hashCode를 구현해야합니다.

0

당신은 가능성 또한 HashMap에서 사용자 정의 클래스를 사용하기 위해 필요 Cell에 대한 hashcode() 기능을 구현하는 것을 잊었다. 여기에 hashcode() 기능을 구현하는 간단하고 일반적으로 정확한 방법입니다 : fieldNfield1이 클래스의 필드입니다

int hashcode(){ 
    return (field1.toString()+field2.toString()+...+fieldN.toString()).hashcode(); 
} 

. 필드가 프리미어 인 경우 (즉 int) toString()을 가져옵니다.

관련 문제