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

Java HashMap crazy behavior with duplicate keys

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

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));
}

想法是 values 是一个 Iterator<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

这里发生了什么?

根据您的描述,您的问题似乎是 "currentBrowser" 对象实际上并没有改变。意思是:你在每次迭代中添加相同的对象;除此之外,您正在更改该对象的内部表示。

长话短说:我认为问题在于您的迭代器始终返回 SAME 对象。