HashMap新手程序员,为什么containsKey在我的程序中返回false

时间:2016-03-25 11:06:10

标签: java hashmap

很抱歉,如果这是基本的,但我正在启动java,这不是任何任务,但为什么我的简单测试程序失败?

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 个答案:

答案 0 :(得分:4)

很明显 - 你没有在你命名严格的对类中重写equals和hashCode。

阅读Joshua Bloch&#34; Effective Java&#34;的第3章。看看如何正确地做到这一点。

深浅不等的区别。如果不重写等于,则比较对象引用。对具有相同数据的两个实例的引用是不同的;他们并不浅薄。

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