1. 使用enrtySet()for each遍历
- for (Map.Entry<String,Integer> entry : testMap.entrySet()) {
- //entry.getKey();
- //entry.getValue();
- }
- for (String key : testMap.keySet()) {
- //testMap.get(key);
- }
- Iterator<Map.Entry<String,Integer>> itr1 = testMap.entrySet().iterator();
- while(itr1.hasNext()){
- Map.Entry<String,Integer> entry = itr1.next();
- //entry.getKey();
- //entry.getValue();
- }
- Iterator itr2 = testMap.keySet().iterator();
- while(itr2.hasNext())
- {
- String key = itr2.next();
- testMap.get(key);
- }
比较4种方式的性能。使用100万条数据填充一个Map对象,后遍历这个Map,比较遍历的时间花费。
- public class ComparingMapLoop {
- private static int MAP_SIZE = 1000000;
- private static Map<String, Integer> testMap = new HashMap<String, Integer>(MAP_SIZE);
- static {
- for (int i = 0; i < MAP_SIZE; i++) {
- testMap.put("key_" + i, i);
- }
- }
- public void testMapLoop() {
- long startTime = Calendar.getInstance().getTimeInMillis();
- //First way using entrySet in for-each loop
- for (Map.Entry<String, Integer> entry : testMap.entrySet()) {
- entry.getKey();
- entry.getValue();
- }
- System.out.println("Using entrySet() in for-each loop : " + (Calendar.getInstance().getTimeInMillis() - startTime));
- startTime = Calendar.getInstance().getTimeInMillis();
- //Second way using keySet() in for-each loop
- for (String key : testMap.keySet()) {
- testMap.get(key);
- }
- System.out.println("Using keySet() in for-each loop : " + (Calendar.getInstance().getTimeInMillis() - startTime));
- startTime = Calendar.getInstance().getTimeInMillis();
- //Third way using Iterator on entrySet() in while loop
- Iterator<Map.Entry<String, Integer>> itr1 = testMap.entrySet().iterator();
- while (itr1.hasNext()) {
- Map.Entry<String, Integer> entry = itr1.next();
- entry.getKey();
- entry.getValue();
- }
- System.out.println("Using entrySet() and iterator : " + (Calendar.getInstance().getTimeInMillis() - startTime));
- startTime = Calendar.getInstance().getTimeInMillis();
- //Third way using Iterator on keySet() in while loop
- Iterator<String> itr2 = testMap.keySet().iterator();
- while (itr2.hasNext()) {
- String key = itr2.next();
- testMap.get(key);
- }
- System.out.println("Using keySet() and iterator : " + (Calendar.getInstance().getTimeInMillis() - startTime));
- }
- public static void main(String[] args) {
- new ComparingMapLoop().testMapLoop();
- }
- }
运行结果:
Using entrySet() in for-each loop : 62
Using keySet() in for-each loop : 89
Using entrySet() and iterator : 58
Using keySet() and iterator : 81
使用entry set 产生的性能相对于key set 迭代来说更强大。当然,其根本原因是使用迭代的方式不同, key set 会两次去执行Map检索查找对已的key-value键值对。