Java中的HashMap不起作用?

时间:2012-07-09 06:57:47

标签: java hashmap

这是我的代码:

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很奇怪,为什么会发生这种情况呢?由于在revenueMap中有一个键具有相同的哈希码并且与参数键相等。 以下是revenueMap和key的当前状态:

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

1 个答案:

答案 0 :(得分: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!