key和value值都需要的三种遍历方法:
方法一:使用entryset()(推荐)
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet())
{
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
方法二:使用keyset()通过键找值方式遍历
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
这个代码看上去比方法一更加干净,但实际上它相当慢且无效率。因为多了一步从键取值,更加耗时。(也是网上说的最多的二次取值方式)
与方法一相比,在不同的Map实现中该方法慢了20%~200%)。
具体的比较可以参考:entryset()和keyset()遍历的时间比较。
总结:同时遍历key和value时,keySet()与entrySet()方法的性能差异取决于key的具体情况,如复杂度(复杂对象)、离散度、冲突率等,换言之,取决于HashMap查找value的开销。entrySet()一次性取出所有key和value的操作是有性能开销的,当这个损失小于HashMap查找value的开销时,entrySet()的性能优势就会体现出来。比如当key是最简单的数值字符串时,keySet()可能反而会更高效,耗时比entrySet