2017-11-24 26 views
1

HashMap을 사용하여 스파 스 그리드를 구현하려하지만 hashCode()를 재정의하면 예상 한대로 작동하지 않습니다.자바 해시 코드가 HashMap에서 작동하지 않습니까?

A 

그러나, 출력은 다음과 같습니다 : 나는 수 출력을 예상하고있어

public class Main { 

private static class Coord { 
    int x, y; 

    public Coord(int x, int y) { 
     this.x = x; 
     this.y = y; 
     } 

     @Override 
     public int hashCode() { 
      // See https://en.wikipedia.org/wiki/Pairing_function#Cantor_pairing_function 
      return (((x + y) * (x + y + 1))/2) + y; 
     } 
    } 

    public static void main(String[] args) { 
     HashMap<Coord, String> grid = new HashMap<Coord, String>(); 
     grid.put(new Coord(0, 0), "A"); 
     System.out.println(grid.get(new Coord(0, 0))); 
    } 
} 

: 나는 다음과 같은 코드를 내 문제를 삶은했습니다

null 

모두 "새로운 Coord (0, 0)"인스턴스는 같은 hashCode()를 반환해야하지만 예상대로 작동하지 않습니다. 왜 내가 기대했던대로 작동하지 않니?

+4

당신은 또한 equals –

+1

을 오버라이드해야합니다.'HashMap'은 원하는 것을하기 위해'hashCode'와'equals' 둘 다 필요로합니다. –

답변

4

HashMaphashCode에만 사용할 수 없습니다. 그것은 equals에도 의존합니다.

설명 이유는 HashMap<String, ?>입니다. 잠깐 동안 무한한 메모리가 있다고 가정하면이 맵에 대해 무한 수의 키를 만들 수 있지만 가능한 해시 코드는 430 만 개 정도입니다 (가능한 숫자는 int). 따라서 충돌이있을 것입니다. 올바른 키 값을 얻으려면 equals이 필요합니다.