当前位置: 首页 > 知识库问答 >
问题:

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

尉迟国发
2023-03-14

抱歉,如果这是基本的,但我正在启动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个答案

子车峰
2023-03-14

这很明显--您没有在名称不正确的pair类中重写equals和hashCode。

阅读Joshua Bloch“有效的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

}
 类似资料:
  • 我正在写一个从文件中读取行的程序。 正在使用。例如,使用的密钥是“InboundTCP”。 从缓冲读取器读取第一行时,hashmap的containsKey(key)返回false,并添加一个新条目,这是显而易见的情况。但是,如果有另一行带有键“InboundTCP”,则containskey(key)返回false。 我放置了一个断点,并看到哈希代码不同。它将作为新条目添加。对于所有其他后续读取

  • 问题内容: 我有一个用于存储对象的HashMap: 但是,当尝试检查键是否存在时,方法会返回。 和方法已实现,但未找到密钥。 调试一段代码时: 我有: 但 是什么原因导致这种奇怪的行为? 问题答案: 将密钥插入地图后,您不得对其进行修改。 编辑:我在Map中找到了javadoc的摘录: 注意:如果将可变对象用作地图键,则必须格外小心。如果在对象是映射中的键的情况下以影响等值比较的方式更改对象的值,

  • 我有邮件地址的以及用户ID(列表中的每个条目类似于::,:)。 我想创建一个,其中每个键都是电子邮件地址的域名,value是来自该域的电子邮件列表: 为了达到这个目的,我做下面的事情。问题是,当我试图向条目上现有的列表添加新的列表条目时,java会向添加新的记录,而不是使用当前的记录。我的预测是方法总是返回false。 我得到的输出: 应该是:

  • 本文向大家介绍C++ 程序员为什么看不起php程序员,包括了C++ 程序员为什么看不起php程序员的使用技巧和注意事项,需要的朋友参考一下 我觉得C++ 虽然速度快,但是编译起来很复杂,要写各种dependency 才不会导致因编译顺序产生的失败。namespace 的乱用和混用让人摸不着头脑。不同的Cpp可以共用一个h,你都找不到申明在哪里。 PHP就好多了。类似java,文件名就是class

  • 我正在解析一个文件,其中有城市名和到其他城市的距离,格式如下: 我认为问题在于,当我分割字符串时,它创建了不同的对象,并且由于某种原因,string.equals和/或hashcode()给出了不同的结果。因此,map.get(key)返回空值。但我不知道如何解决这个问题。 }

  • 问题内容: 即使正则表达式应返回true,程序也不会退出。代码有什么问题? 问题答案: 仅当整个字符串与正则表达式匹配时才返回。在你的情况下,你的正则表达式仅代表 一个 字符不是,或。 我怀疑您要检查字符串是否包含您在正则表达式中描述的这些特殊字符之一。在这种情况下,请将您的正则表达式括起来,以使正则表达式匹配整个字符串。哦,您不必逃脱character class内部。