2017-11-24 11 views
1

私はHashMapを使用してスパースグリッドを実装しようとしていますが、hashCode()をオーバーライドしても期待通りの動作をしていないようです。しかし、出力がJavaのhashCodeはHashMapで動作しませんか?

A 

null 

どちらも私は、出力があることを期待してい

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))); 
    } 
} 

:私は次のコードに私の問題を煮詰めてきました"新しいCoord(0、0)"インスタンスは同じhashCode()を返さなければなりませんが、期待通りに動作していないようです。なぜ私は期待どおりに動作しませんか?

+4

equalsも同じく –

+1

をオーバーライドする必要があります。 'HashMap'は、あなたがしたいことをするために' hashCode'と 'equals'の両方を必要とします。 –

答えて

4

HashMapは、hashCodeだけでは機能しません。それはequalsにも依存しています。

理由を説明するため、HashMap<String, ?>を考えてみましょう。 1秒間に無限のメモリがあると仮定すると、このマップには無限の数の鍵を作成できますが、可能なハッシュコードは430万回程度しかありません(可能な数はintです)。したがって、衝突が発生します。正しい鍵の値を取得するためには、equalsが必要です。

関連する問題