ContainsKey不识别现有密钥

时间:2015-09-13 22:11:40

标签: java hashmap

我有以下Java代码,我将使用StringTokenizer中的一组单词添加到HashMap中。 StringTokenizer中的每个单词都应该作为键添加到Map中,如果单词已经存在,键的值应该加1。

Map<String, Integer> hM = new HashMap<String, Integer>();
StringTokenizer st = new StringTokenizer(fileContent, this.delimiters, false);
while (st.hasMoreTokens()) {
    String token = st.nextToken();
    String key = token.trim().toLowerCase();
    if(!stopWordsList.contains(key))
    {
        if(hM.containsKey(key))
        {
            Integer newValue = hM.get(key)+1;
            //hM.put(key, hM.get(key) + 1);

            hM.put(key, newValue );
            //System.out.println(key + " " + newValue);
        }
        else
        {
            hM.put(key, 1);
            System.out.println(key + " " + "1");
        }
    }
}

麻烦的是,有些单词会多次添加到HashMap中,值为1,所以看起来containsKey方法找不到某些现有的键。然而,在很多情况下,单词被找到并且值正确递增。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

以下是一些可能的解释:

  • 你有竞争条件。具体来说,这个代码是由多个线程密集执行的,没有适当的同步。如果访问/更新未正确同步,则一个线程可能无法看到第二个线程的更新结果;即hM.containsKey(key)在返回false时可以返回true

  • 您的代码的其他部分内容正在删除条目,或清除或重新初始化HashMap

  • hM的范围错误,此代码每次都会看到不同的HashMap实例。

  • 您向我们展示的代码并不是实际运行代码的准确表示;例如

    • 您在撰写问题时已经改变了一些内容,或者
    • 您的构建/部署/运行程序存在问题。