【问题标题】:HashMap in Java. hash.containsKey returns unexpectedJava中的HashMap。 hash.containsKey 返回意外
【发布时间】:2014-05-14 15:49:26
【问题描述】:

我对 hashMap 有疑问。更具体的是 containsKey。 我想检查我的哈希中是否存在对象。问题是当我用 2 个包含相同确切数据的不同对象调用此方法时,它们应该具有相同的 hashCode。

Person pers1,pers2;
pers1=new Person("EU",22);
pers2=new Person("EU",22);

public int hashCode(){ //From Person Class
    return this.getName().hashCode()+age;
}

在我的哈希中插入 pers1 键并调用“hash.containsKey(pers1);”后返回 true,但“hash.containsKey(pers2)”返回 false。为什么以及如何解决这个问题?

谢谢!

【问题讨论】:

  • 你是否也覆盖了 equals ?

标签: java hash hashmap


【解决方案1】:

问题的原因似乎是您没有覆盖 Person 类中的 equals 方法。 Hashmap 在搜索时需要它来定位键。

搜索密钥时执行的步骤如下:

1) 在对象(键)上使用 hashCode() 来定位可以放置键的适当存储桶。

2) 找到bucket后,尝试使用equals()方法找到特定的Key。

【讨论】:

    【解决方案2】:

    containsKey() 使用您似乎没有覆盖的.equals() 方法。 .hashCode() 提供跨哈希表的标准化(理想情况下)分布,它不进行任何相等比较(除了要求两个相等的对象需要相同的哈希码)。

    你可以在源代码中看到:

    if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
    

    【讨论】:

    • public boolean equals(Object p){ if(p==null) return false; if(this.getAge()==p.getAge() && this.getName().equals(p.getName())) return true; ` return false; }` 我不知道如何用 Object 作为参数编写这个方法,所以我可以覆盖......
    • 快速搜索显示this post。您在 equals 实施中缺少演员表。 (之后你可以使用它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2019-03-23
    • 2021-07-29
    • 2021-02-06
    • 2020-06-24
    相关资源
    最近更新 更多