在大学的时候记得学过通过迭代器进行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遍历

















