具有重复键的Java HashMap疯狂行为

时间:2015-03-23 11:31:33

标签: java dictionary hashmap

这真的很奇怪。这是我的代码:

Map<Text,Integer> frequencies = new HashMap<Text,Integer>();
Text currentBrowser = new Text();

// update map with browser frequencies
while(values.hasNext()){
    currentBrowser = values.next();
    if (frequencies.containsKey(currentBrowser))
        frequencies.put(currentBrowser, frequencies.get(currentBrowser) + 1);
    else
        frequencies.put(currentBrowser, new Integer(1));
}

我的想法是valuesIterator<Text>,它包含浏览器列表(Chrome,IE等)。我只是想创建一个存储每个浏览器频率的地图(如果Chrome在列表中出现3次 - 我希望它的值为3,等等。)

麻烦的是,这不起作用。当我逐步调试它时,会发生以下情况: 第一个浏览器是Explorer,它将它正确放入地图中: {Explorer=1}。接下来是Safari,所以它会进入else,但这就是地图发生的事情:{Safari=1, Safari=1}!接下来的两个浏览器是Safari,它们确实插入了{Safari=1, Safari=3},但随后是Firefox,这就是:{Firefox=1, Firefox=1, Firefox=3}。因此,您可以看到每次将新密钥插入到地图中时,它也会更改所有其他密钥。第一个Firefox应该是Explorer,第二个应该是Firefox,第三个应该是Safari。

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

从您的描述看起来您的问题是&#34; currentBrowser&#34;对象实际上并没有改变。含义:在每次迭代期间添加SAME对象;除此之外,您正在更改该对象的INTERNAL表示。

长话短说:我认为问题是你的迭代器一直在返回SAME对象。