gpt4 book ai didi

Java map.containsKey 不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 01:47:52 25 4
gpt4 key购买 nike

这似乎是一个简单的问题,但我现在已经尝试了几个小时(无需执行 hashCode 比较)来使 containsKey 正常工作。为了简化事情,我将发布一个我遇到问题的简单代码示例:

public class myPair {
private int a;
private int b;

myPair(int x, int y) {
a=x;
b=y;
}

public boolean equals(Object pair) {
System.out.println("Ola");
return true;
}


int first() { return a; }
int second() { return b; }

public String toString() {
return "X: "+this.a + " Y:"+this.b;
}
}

public class Main {
public static void main(String args[]){
Map<myPair,String> myMap = new LinkedHashMap<myPair, String>();
myMap.put(new myPair(2, 2), "encontrou me");
if(myMap.containsKey(new myPair(2, 2))){
System.out.println(myMap.get(new myPair(2, 2)));
}
System.out.println(myMap.get(new myPair(2,2)));
}
}

这个输出:

null

我已经实现了 equals 方法...为什么它不起作用?

最佳答案

因为您必须覆盖hashCode 才能使用HashMap(或LinkedHashMap)。这就是散列映射的工作原理:它们首先计算散列码以粗略地了解在何处查找对象。如果哈希码不等于目标对象的哈希码,它只会在错误的地方寻找对象!

这是来自 Object.hashCode 的 API 文档:

  • If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

hashCode 的默认实现大多数时候不会为两个不同的对象返回相同的哈希码。

基本上,您通过覆盖 equals 而不是 hashCode 违反了 API 的约定。

关于Java map.containsKey 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4009866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com