map.containsKey从未在java中工作过

时间:2015-01-29 17:24:15

标签: java dictionary

我正在基于每个对象中存在的一些相等属性来对给定对象进行聚合。

final Map<JBlockedPerGT, JBlockedPerGT> ret = new HashMap<JBlockedPerGT, JBlockedPerGT>();

    while (allRows.hasNext()) {
        final JBlockedPerGT blockedPerGT = allRows.next();

        JBlockedPerGT updated = null;
        if (ret.containsKey(blockedPerGT)) {
            JBlockedPerGT current = ret.get(blockedPerGT);
            updated = current.add(blockedPerGT);
        } else {
            updated = blockedPerGT;
        }

        ret.put(updated, updated);
    }

    return ret.values().iterator();

它永远不会进入if条件,并且没有发生任何聚合,并且每个聚合都被视为不同的对象。问题是,我没有正确理解它是如何工作的。我的JBlockedPerGT实现了hashcode和equals方法。

任何人都可以帮助我ret.containsKey(blockedPerGT)

我的hashcode和equals方法是

public int hashCode() {
    int result = 1;
    result = PRIME * result + ((gt == null) ? 0 : gt.hashCode());
    result = PRIME * result
            + ((messageType == null) ? 0 : Type.hashCode());
    result = PRIME * result
            + ((country == null) ? 0 : country.hashCode());
    result = PRIME * result
            + ((network == null) ? 0 : network.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    JBlockedPerGTImpl other = (JBlockedPerGTImpl) obj;
    if (gt == null) {
        if (other.gt != null)
            return false;
    } else if (!gt.equals(other.gt))
        return false;
    if (messageType != other.messageType)
        return false;
    if (country == null) {
        if (other.country != null)
            return false;
    } else if (!country.equals(other.country))
        return false;
    if (network == null) {
        if (other.network != null)
            return false;
    } else if (!network.equals(other.network))
        return false;
    return true;
}

}

由于

2 个答案:

答案 0 :(得分:2)

您的JBlockedPerGT课程可能不符合hashCode / equals合同。

覆盖hashCode的{​​{1}}方法允许哈希集合推断对象相等。

您正在使用ObjectHashMap作为密钥存储,JBlockedPerGT被正确覆盖至关重要(因此,JBlockedPerGT#hashCode()应该是equals也被覆盖了)。

请参阅API

修改

由于你确实有一些equals / hashCode实现,我会仔细检查你正在比较/散列的字段以及它们在相等性测试中的真实相关性(即如果不管你怎么做)从持久性检索错误地或有意地填充其中一个字段?)。

我还会使用调试器并分析检索到的JBlockedPerGT个对象的内部。

答案 1 :(得分:0)

在将JBlockedPerGT对象用作地图中的键后,您很可能会更改哈希生成属性或等同确定属性。

最好将地图密钥对象实现为不可变的。否则你会遇到这样的情况,你无法在地图中找到一个密钥,因为它的“身份”随后发生了变化。