java中如何高效遍历Map集合

 1. 前言

【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。 说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。

2.map集合遍历的几种方式

foreachKeyset 遍历

//根据 key 找 value
for (Integer key : map.keySet()) {
            String value = map.get(key);
            // System.out.println("foreachKeyset : key :" + key + "---> value :"+ value);
}
foreachEntry遍历
//根据 key--value 键值对 找键和值 ( foreach 遍历)
for (Entry<Integer, String> entry : map.entrySet()) {
            // System.out.println("foreachEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
        }
iteratorEntry遍历
//根据 key--value 键值对 找键和值 ( iterator 遍历)
Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Entry<Integer, String> entry = iterator.next();
            //System.out.println("iteratorEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
        }
lambadaEntry遍历
//基于JDK1.8版本以上 lambada函数
map.forEach((k, v) -> {
            System.out.println("key:"+k+"values:"+v);
        });

mapValues遍历

//只能取到values
for(Object m:map.values()){
System.out.println(m);
}

测试实例:

package com.xiaoxit.erp.core.controller.exe;

/**
 * @version 1.0
 * @ClassName s
 * @Description
 * @Author wuronghua
 * @Date 2019/11/6 16:22
 */

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.junit.Test;

/**
 * description: 遍历Map集合效率比较
 *
 * @author w
 * @version v1.0
 * @date 2018年10月23日上午11:20:08
 */
public class ForeachMap {
    /**
     * description: 初始化map集合中元素
     *
     * @param map
     * @version v1.0
     * @author w
     * @date 2018年10月23日 下午2:45:35
     */
    public void init(Map<Integer, String> map) {
        // 初始化map集合中元素的个数
        int count = 1000000;
        for (int i = 1; i <= count; i++) {
            map.put(i, i + " ---> map");
        }
    }


    /**
     * 在只需要values时,for (Object m : map.values()) 最快
     * 同时需要key,values时,iterator 最快
     */
    @Test
    public void test() {
        Map<Integer, String> map = new HashMap<>();
        Map<Integer, String> map2 = new HashMap<>();
        long start = System.currentTimeMillis();
        init(map);
        init(map2);
        System.out.println("装载map耗时: " + (System.currentTimeMillis() - start) + " ms");

        start = System.currentTimeMillis();
        foreachKeyset(map);
        System.out.println("foreachKeyset 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");

        start = System.currentTimeMillis();
        foreachEntry(map2);
        System.out.println("foreachEntry 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");

        start = System.currentTimeMillis();
        iteratorEntry(map2);
        System.out.println("iteratorEntry 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");

        start = System.currentTimeMillis();
        lambadaEntry(map2);
        System.out.println("lambadaEntry 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");


        start = System.currentTimeMillis();
        mapValuesEntry(map2);
        System.out.println("mapValuesEntry 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");

        System.out.println(map.size());


    }

    /**
     * description: 根据 key 找 value
     *
     * @param map
     * @version v1.0
     * @author w
     * @date 2018年10月23日 下午5:10:01
     */
    private void foreachKeyset(Map<Integer, String> map) {
        for (Integer key : map.keySet()) {
            String value = map.get(key);
            // System.out.println("foreachKeyset : key :" + key + "---> value :"+ value);
        }
    }

    /**
     * description: 根据 key--value 键值对 找键和值 ( foreach 遍历)
     *
     * @param map
     * @version v1.0
     * @author w
     * @date 2018年10月23日 下午5:19:31
     */
    private void foreachEntry(Map<Integer, String> map) {
        for (Entry<Integer, String> entry : map.entrySet()) {
            // System.out.println("foreachEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
        }
    }

    /**
     * description: 根据 key--value 键值对 找键和值 ( iterator 遍历)
     *
     * @param map
     * @version v1.0
     * @author w
     * @date 2018年10月23日 下午5:19:01
     */
    private void iteratorEntry(Map<Integer, String> map) {
        Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Entry<Integer, String> entry = iterator.next();
            //System.out.println("iteratorEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
        }
    }

    /**/
    private void lambadaEntry(Map<Integer, String> map) {
        map.forEach((k, v) -> {
            System.out.println("key:"+k+"values:"+v);
        });
    }

    /*
    * 通过Map.values()遍历所有的value,但不能遍历key
     */
    private void mapValuesEntry(Map<Integer, String> map) {
        for (Object m : map.values()) {
        }
    }

}

装载map耗时: 4119 ms
foreachKeyset 遍历 map耗时: 41 ms
foreachEntry 遍历 map耗时: 27 ms
iteratorEntry 遍历 map耗时: 25 ms
lambadaEntry 遍历 map耗时: 96 ms
mapValuesEntry 遍历 map耗时: 30 ms
1000000

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值