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 对象。
这真的很奇怪。这是我的代码:
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 对象。