深度比较Map的遍历

在Java项目中,常常会涉及到Map的遍历。然而,不同的方式遍历Map时,效率是不一样的。我总结了一下,可能会有的4种方式来实现Map的遍历。

1.使用enrtySet()for each遍历

for (Map.Entry<String,Integer> entry : testMap.entrySet()) {
    //entry.getKey();
    //entry.getValue();
}

 
2. 使用keySet() for each 遍历

for (String key : testMap.keySet()) {
    //testMap.get(key);
}
3. 使用 enrtySet() 迭代遍历

Iterator<Map.Entry<String,Integer>> itr1 = testMap.entrySet().iterator();
while(itr1.hasNext()){
    Map.Entry<String,Integer> entry = itr1.next();
    //entry.getKey();
    //entry.getValue();
}
4. 使用 keySet()迭代遍历

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键值对。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值