HashMap四种遍历方式及性能比较

HashMap map = new HashMap<>();
(1)
/*显式调用map.entrySet()集合迭代器*/
Iterator iter1 = map.entrySet().iterator();
while(iter1.hasNext())
{
Entry entry = (Entry) iter1.next();
Object a = entry.getKey();
Object b = entry.getValue();
}
(2)
/*foreach增强for循环实现entrySet*/
for (Entry str : map.entrySet()) {
int a = str.getKey();
String b = str.getValue();
}
(3)
/*显式调用map.keySet()集合迭代器*/
Iterator iter2 = map.keySet().iterator();
while(iter2.hasNext())
{
String c = map.get(iter2.next());
}
(4)
/*foreach增强for循环实现keySet*/
for (Integer str : map.keySet()) {
String c = map.get(str);
}
经过运行多次发现,显式调用map.entrySet()集合迭代器与foreach增强for循环时耗几乎差不多,而当map容量较大时(比如千万级别)(1)、(2)和(3)、(4)对比会发现,entrySet会比keySet快不少,经过思考发现,如果纯粹遍历不去取值的话,两者性能几乎相同(查看底层源码,会发现只是返回值不同,父类相同,所以性能相差不多),而相差的时耗在于要取值的一步(很多人在这里理解为keySet方式遍历了两次),keySet会通过get方法(查看源码发现get的时间复杂度取决于for循环的次数,也可以量化为map容量大小)而entrySet则不需要,所以我们可以这样去使用:
(1)当需要key也需要value时,毫不犹豫选择entrySet,
(2)当只是遍历key而无需取value的话,使用keySet即可。
(3)foreach更简洁,推荐使用。

你可能感兴趣的:(java)