我有以下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方法找不到某些现有的键。然而,在很多情况下,单词被找到并且值正确递增。
我错过了什么?
答案 0 :(得分:1)
以下是一些可能的解释:
你有竞争条件。具体来说,这个代码是由多个线程密集执行的,没有适当的同步。如果访问/更新未正确同步,则一个线程可能无法看到第二个线程的更新结果;即hM.containsKey(key)
在返回false
时可以返回true
。
您的代码的其他部分内容正在删除条目,或清除或重新初始化HashMap
。
hM
的范围错误,此代码每次都会看到不同的HashMap
实例。
您向我们展示的代码并不是实际运行代码的准确表示;例如