1

这是我的代码:

double getRevenue(KeywordGroupKey key) {
    Double r = revenueMap.get(key);
    System.out.println(key + "\t" + key.hashCode());
    for (KeywordGroupKey other : revenueMap.keySet()) {
        System.out.println(other.toString() + "\t" + other.hashCode());
        if(other.equals(key))
            System.out.println("equals here...");
    }
    if(r == null)
        r = 0.0;
    return r;
}

这是输出:

优惠打折,优惠券|"优惠券"  955095524
brand+点评团购|大众点评 726983298
brand-品牌词相关|团购网站大全  -713384514
brand-品牌词|点评网   2029153675
brand+点评团购|大众点评网    261410621
优惠打折,优惠券|"优惠券"  955095524
equals here...

所以奇怪的是方法返回的值是null,为什么会出现这种情况呢?由于recommitmentMap 中有一个key 具有相同的哈希码并且与参数key 相等。以下是收入地图和键的当前状态:

{brand+点评团购|大众点评=28.0, brand-品牌词相关|团购网站大全=49.9, brand-品牌词|点评网=21.0, brand+点评团购|大众点评网=167.0, 优惠打折,优惠券|"优惠券"=9.9}
优惠打折,优惠券|"优惠券"
4

1 回答 1

7

我的猜测是它KeywordGroupKey是可变的,并且有问题的键在用作哈希映射的键后被修改。

如果是这种情况,那么密钥在错误的“桶”中,HashMap并且get()方法(或containsKey()方法)永远不会找到它(但遍历密钥和/或条目找到它!)。

例如,假设foo您的类中有一个属性,并且该属性与您的hashCode()equals()方法相关。以下代码将“破坏” HashMap

KeywordGroupKey key = ...
revenueMap.put(key, someValue);
key.setFoo("differentValue");
Double result = revenueMap.get(key); // will return nothing!
Double result = revenueMap.get(originalValueOfKey); // will *also* return nothing!
于 2012-07-09T07:11:23.140 回答