【问题标题】:HashMap novice programmer , why is containsKey returning false in my program [duplicate]HashMap 新手程序员,为什么 containsKey 在我的程序中返回 false [重复]
【发布时间】:2016-07-13 03:20:18
【问题描述】:

对不起,如果这是基本的,但我正在启动 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)));
     }

 }

【问题讨论】:

标签: java hashmap


【解决方案1】:

很明显 - 您没有在命名错误的 pair 类中覆盖 equals 和 hashCode。

阅读 Joshua Bloch 的“Effective Java”的第 3 章,了解如何正确地做到这一点。

这是深等于和浅等于的区别。当您不覆盖 equals 时,您会比较对象引用。对具有相同数据的两个实例的引用是不同的;他们不是平等的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多