我有以下情况 -
我正在使用泛型创建HashMap。键的类型为TestHashMap,值的类型为String。
在TestHashMap的主要方法中,我使用三个TestHashMap实例作为存储三个不同字符串的键。
我覆盖hashcode()方法,以便在每次调用时返回一个不同的整数。
然后我在HashMap中提取密钥并打印出相应的值。
这给了我完全意想不到的结果 - 我得到了三个键值对中每个值 的 null。
请注意,如果不是在hashcode()的不同调用上返回不同的整数,我只返回相同的整数,一切正常。
这让我非常困扰。任何帮助将不胜感激。
这是代码。如果你按原样复制它,你应该可以运行它。
import java.util.HashMap;
import java.util.Set;
public class TestHashMap {
private static int hash = 0;
public static void main(String[] args) {
HashMap<TestHashMap,String> h = new HashMap<TestHashMap,String>();
TestHashMap thm1 = new TestHashMap();
TestHashMap thm2 = new TestHashMap();
TestHashMap thm3 = new TestHashMap();
h.put(thm1, "one");
h.put(thm2, "two");
h.put(thm3, "three");
Set<TestHashMap> keys = h.keySet();
for(TestHashMap k : keys){
System.out.println(k + " " + h.get(k));
}
}
@Override
public int hashCode(){ return hash++;}
}
答案 0 :(得分:6)
当您将对象放入地图时,地图会读取密钥的哈希码并将其放入相应的存储桶中;
当您稍后通过相同的密钥获取对象时,地图将再次读取密钥的哈希码并查找对象等于那桶里的钥匙;
但是您的密钥每次都会为地图提供不同的哈希码。因此,糟糕的地图被诱骗进入错误的桶中。