2016-03-25 6 views
1

申し訳ありませんが、これは基本ですが、私はJavaを起動していますが、これは割り当てではなく、なぜ簡単なテストプログラムが失敗しますか?HashMapの初心者プログラマー、私のプログラムでcontainsKeyがfalseを返すのはなぜですか?

static public class pair 
{ 
    public int x; 
    public int y; 
    public pair(int a , int b) 
    { 
     x = a; 
     y = b; 
    } 
} 
public static void main(String args[]) 
{ 
    HashMap<pair,Integer>m = new HashMap<pair,Integer>(); 
    m.put(new pair(1,2), 3); 
    if(m.containsKey(new pair(1,2))) 
    { 
     System.out.println("is there " + m.get(new pair(1,2))); 
    } 

} 
+1

これは同様の質問です:http://stackoverflow.com/questions/12774723/calling-containskey-on-a-hashmap-with-custom-class?rq=1 –

+2

もしあなたが 'equals'をオーバーライドしていなければ'hashCode'を実行すると、すべてのオブジェクトが異なっているということになります。 –

+1

Javaコードスタイル https://google.github.io/styleguide/javaguide.html –

答えて

4

悪い名前のペアクラスでequalsとhashCodeをオーバーライドしていないことは明らかです。

ジョシュア・ブロッホの「効果的なJava」の第3章を読んで、それを正しく行う方法を見てください。

これは、深い浅い平等の違いです。 equalsをオーバーライドしない場合は、オブジェクト参照を比較します。同じデータを持つ2つのインスタンスへの参照は異なります。彼らは浅い平等ではありません。

new pair(1,2).equals(new pair(1,2)) // returns false 
new pair(1,2) == new pair(1,2) // returns false 

クラスの内容を比較するためにequalsをオーバーライドすると、適切に行うとチャンスがあります。

new pair(1,2).equals(new pair(1,2)) // will return true after override 
new pair(1,2) == new pair(1,2) // returns false 

は学び、Javaのコーディング標準に従ってください: Pair、ない pairでなければなりません。

あなたPairクラスは、一般的なように、より有用であろう:

public class Pair<U, V> { 
    public final U u; 
    public final V v; 

    public Pair<U, V>(U foo, V bar) { 
     this.u = foo; 
     this.v = bar; 
    } 

    // override equals and hashCode 

} 

JDK8でPairクラスはありますか?興味深い議論here

関連する問題