在大学的时候记得学过通过迭代器进行Map的遍历,但是从参加工作后,基本都是通过for循环遍历,没用过迭代器,于是去了解了Map的几种遍历方法并通过运行测试各自的速度。
注意:这里只讲通过遍历同时能过获取key和value的遍历,所以不记录values()方法的遍历
遍历方法为两种:
- Iterator迭代器遍历
- for循环遍历
但是从细节上,迭代器遍历还分为:
- KeySet遍历
- EntrySet遍历
目录
- 一、Iterator迭代器遍历
- KeySet遍历
- EntrySet遍历
- 二、for循环
- 三、测试性能
- 四、总结
一、Iterator迭代器遍历
KeySet遍历
- 通过keySet()方法获取map的键集合
- 获取键集合的迭代器
- 遍历键集合
- 通过键获取map中对应的值
Set keyset = map.keySet();
Iterator iterator = keyset.iterator();
while(iterator.hasNext()){
String key = (String) iterator.next();
String value = targetMap.get(key);
}
EntrySet遍历
- 通过entrySet()将map中的每一个键值对作为一个Map.Entry实例化后的set集合
- 获取Set集合的迭代器
- 遍历Set集合
- 通过Map.Entry的getKey()和getValue()方法获得键值
Set entrySet =map.entrySet();
iterator = entrySet.iterator();
while(iterator.hasNext()){
Map.Entry entry = (Map.Entry) iterator.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
}
二、for循环
JDK1.8提供了forEach方法遍历
Map.forEach((key,value)->{
System.out.println("key:"+key+",value"+value);
});
三、测试性能
运行一下代码,测试对应遍历所需时间
Map<String,String> targetMap = new HashMap<String,String>(){
{
put("1","!");
put("S","F");
put("as","g");
put("&","b");
put("s","d");
put("2","!");
put("3S","F");
put("4","g");
put("5","b");
put("6","d");
put("7","!");
put("8","F");
put("9","g");
put("10","b");
put("11","d");
}
};
long start = 0;
long end = 0;
System.out.println("for 循环模式 开始");
start = System.currentTimeMillis();
targetMap.forEach((key,value)->{
// System.out.println("key:"+key+",value"+value);
});
end = System.currentTimeMillis();
System.out.println(String.format("for 循环模式 结束 用时:%d ms",end-start));
System.out.println("keySet 循环模式 开始");
start = System.currentTimeMillis();
Set keyset = targetMap.keySet();
Iterator iterator = keyset.iterator();
while(iterator.hasNext()){
String key = (String) iterator.next();
String value = targetMap.get(key);
// System.out.println("key:"+key+",value"+value);
}
end = System.currentTimeMillis();
System.out.println(String.format("keySet 循环模式 结束 用时:%d ms",end-start));
System.out.println("EntrySet 循环模式 开始");
start = System.currentTimeMillis();
Set entrySet =targetMap.entrySet();
iterator = entrySet.iterator();
while(iterator.hasNext()){
Map.Entry entry = (Map.Entry) iterator.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
// System.out.println("key:"+key+",value"+value);
}
end = System.currentTimeMillis();
System.out.println(String.format("EntrySet 循环模式 结束 用时:%d ms",end-start));
运行结果如下:
四、总结
速度比较
Iterator遍历>foreach
entrySet遍历>keySet遍历