Java HashMap的大小()是否与其实际条目的大小不同步?

tri*_*rix 8 java size hashmap

我有一个名为statusCountMap的Java HashMap.
调用size()会导致30.
但是如果我手动计算条目,
则为31 这是我的一个TestNG单元测试.下面的结果来自Eclipse的显示窗口(类型代码 - >突出显示 - >点击评估所选文本的显示结果).

statusCountMap.size()
     (int) 30
statusCountMap.keySet().size()
     (int) 30
statusCountMap.values().size()
     (int) 30
statusCountMap
     (java.util.HashMap) {40534-INACTIVE=2, 40526-INACTIVE=1, 40528-INACTIVE=1, 40492-INACTIVE=3, 40492-TOTAL=4, 40513-TOTAL=6, 40532-DRAFT=4, 40524-TOTAL=7, 40526-DRAFT=2, 40528-ACTIVE=1, 40524-DRAFT=2, 40515-ACTIVE=1, 40513-DRAFT=4, 40534-DRAFT=1, 40514-TOTAL=3, 40529-DRAFT=4, 40515-TOTAL=3, 40492-ACTIVE=1, 40528-TOTAL=4, 40514-DRAFT=2, 40526-TOTAL=3, 40524-INACTIVE=2, 40515-DRAFT=2, 40514-ACTIVE=1, 40534-TOTAL=3, 40513-ACTIVE=2, 40528-DRAFT=2, 40532-TOTAL=4, 40524-ACTIVE=3, 40529-ACTIVE=1, 40529-TOTAL=5}
statusCountMap.entrySet().size()
     (int) 30

是什么赋予了 ?有谁经历过这个?
我很确定此时没有修改statusCountMap.
有两种方法(让我们称之为methodA和methodB)通过重复调用incrementCountInMap来同时修改statusCountMap .

private void incrementCountInMap(Map map, Long id, String qualifier) {
    String key = id + "-" + qualifier;
    if (map.get(key) == null) {
        map.put(key, 0);
    }
    synchronized (map) {
        map.put(key, map.get(key).intValue() + 1);
    }
}

methodD是我遇到问题的地方.methodD有一个TestNG @dependsOnMethods = {"methodA","methodB"}所以当methodD正在执行时,statusCountMap已经非常静态了.我提到这个是因为它可能是TestNG中的一个错误.
我正在使用Sun JDK 1.6.0_24.TestNG是testng-5.9-jdk15.jar

嗯...重读我的帖子之后,是不是因为同步块map.get(key)== null&map.put(key,0)的并发执行造成了这个问题?

Pet*_*rey 12

如果您在将密钥添加到HashMap后修改密钥,我相信您可以实现此目的.

但是在您的情况下,似乎只是在没有正确同步的情况下在两个线程中修改相同映射的情况.例如,在线程A,map.put(key,0)中,线程B map.put(key2,0)可以产生1或2的大小.如果对remove执行相同操作,则最终可能会大于你应该.