首页 > 编程语言 >Java 中 Map 的5种遍历方式

Java 中 Map 的5种遍历方式

时间:2022-10-05 18:45:14浏览次数:53  
标签:Map 遍历 Java map System forEach time println out

主测试方法

    @Test
    public void test1(){
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        int n = 1000_0000;
        for (int i = 1; i <= n; i++) {
            map.put(i, i);
        }

        System.out.println("======== 1 entrySet 最常用 ==========");
        entrySetTest(map);
        System.out.println("======== 2 keySet Or Values 取keys或values 时,效率最高 ==========");
        keySetOrValuesTest(map);
        //System.out.println("======== keySetForValueTest ==========");
        keySetForValueTest(map);
        System.out.println("======== 3 iterator Type ==========");
        iteratorTypeTest(map);
        System.out.println("======== 4 forEach java 8 效率最低 ==========");
        forEachTest(map);
        System.out.println("======== 5 stream ForEach java 8 流式 ==========");
        streamForEachTest(map);

    }

1000万数据测试结果

======== 1 entrySet 最常用 ==========
map.entrySet() time=	65

======== 2 keySet Or Values 取keys或values 时,效率最高 ==========
map.keySet() time=	71
map.keySet().iterator() time=	63
map.values() time=	74
map.values().iterator() time=	64
map.keySet() -> map.get(key) time=	107

======== 3 iterator Type ==========
map.entrySet().iterator() time=	85

======== 4 forEach java 8 效率最低 ==========
map.forEach time=103

======== 5 stream ForEach java 8 流式 ==========
map.entrySet().stream().forEach time=62

2、通过keySet() 或 values()获取
    /**
     * 2(1)keySet values
     * 如果只需要键或者值,这个比键值对的要快
     * @param map
     */
    public void keySetOrValuesTest(Map<Integer, Integer> map){
        long before = System.currentTimeMillis();
        // 遍历map中的键
        for (Integer key : map.keySet()) {
            //System.out.println("Key = " + key);
        }
        long after = System.currentTimeMillis();
        System.out.println("map.keySet() time=\t"  + (after - before));

        before = System.currentTimeMillis();
        // 遍历map中的键
        Iterator<Integer> iteratorKeySet = map.keySet().iterator();
        while (iteratorKeySet.hasNext()) {
            iteratorKeySet.next();
            //System.out.println("key = " + iteratorKeySet.next());
        }

        after = System.currentTimeMillis();
        System.out.println("map.keySet().iterator() time=\t"  + (after - before));


        before = System.currentTimeMillis();
        // 遍历map中的值
        for (Integer value : map.values()) {
            //System.out.println("Value = " + value);
        }
        after = System.currentTimeMillis();
        System.out.println("map.values() time=\t"  + (after - before));

        before = System.currentTimeMillis();
        // 遍历map中的值
        Iterator<Integer> iteratorValues = map.values().iterator();
        while (iteratorValues.hasNext()) {
            iteratorValues.next();
            //System.out.println("key = " + iterator.next());
        }
        after = System.currentTimeMillis();
        System.out.println("map.values().iterator() time=\t"  + (after - before));
    }
    /**
     * 2(2)keySet get
     * 根据键找值,效率很低
     * @param map
     */
    public void keySetForValueTest(Map<Integer, Integer> map){
        long before = System.currentTimeMillis();
        //遍历map中的键
        for (Integer key : map.keySet()) {
            Integer value = map.get(key);
            //System.out.println("Key = " + key + ", Value = " + value);
        }
        long after = System.currentTimeMillis();
        System.out.println("map.keySet() -> map.get(key) time=\t"  + (after - before));
    }

3、通过迭代器 map.entrySet().iterator()
    /**
     * 3(1)iterator type
     * 迭代器 带泛型
     * @param map
     */
    public void iteratorTypeTest(Map<Integer, Integer> map){
        long before = System.currentTimeMillis();
        Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
        while (entries.hasNext()) {
            Map.Entry<Integer, Integer> entry = entries.next();
            Integer key = entry.getKey();
            Integer value = entry.getValue();
            //System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
        }
        long after = System.currentTimeMillis();
        System.out.println("map.entrySet().iterator() time=\t"  + (after - before));
    }

4、map.forEach 注意:java8 才支持
    /**
     * 4 forEach 遍历的是键值,所以是两个参数
     * forEach java8 lambda
     * @param map
     */
    public void forEachTest(Map<Integer, Integer> map){
        long before = System.currentTimeMillis();
        //map.forEach( (key,value) -> {System.out.println("Key = " + key+ ", Value = "+ value);} );
        map.forEach( (key,value) -> {} );
        long after = System.currentTimeMillis();
        System.out.println("map.forEach time=\t"  + (after - before));

        // 一条语句可以省略{}
        //map.forEach( (key,value) -> System.out.println("Key = " + key+ ", Value = "+ value) );
    }

5、map.entrySet().stream().forEach 注意:java8 才支持
    /**
     * 5 stream forEach 遍历的是entry 所以是一个参数
     * stream forEach java8 lambda
     * @param map
     */
    public void streamForEachTest(Map<Integer, Integer> map){
        long before = System.currentTimeMillis();
        //map.entrySet().stream().forEach( (entry) -> {System.out.println("Key = " + entry.getKey()+ ", Value = "+ entry.getValue());} );
        //map.entrySet().stream().forEach( System.out::println);
        map.entrySet().stream().forEach( (entry) -> {} );
        long after = System.currentTimeMillis();
        System.out.println("map.entrySet().stream().forEach time=\t"  + (after - before));

        // 一个参数可以省略()  一条语句可以省略{}
        //map.entrySet().stream().forEach(entry -> System.out.println("Key = " + entry.getKey()+ ", Value = "+ entry.getValue()) );
    }

标签:Map,遍历,Java,map,System,forEach,time,println,out
From: https://www.cnblogs.com/sxhxh/p/16756105.html

相关文章

  • Java 中 List 的5种遍历方式
    本测试没有具体业务,单纯遍历,也许会有误差。主单元测试方法@Testpublicvoidtest(){List<Integer>list=newArrayList<>();intn=100......
  • Effective+Java+中文版 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1lYgUZopqC5MqRFQSiLHW6w点击这里获取提取码 ......
  • vue(8)v-model与JavaScript中array对象的配合使用
    序实现了之前代码的删除功能,并加入了对于复选框的全选,全不选,反选等功能示例代码展开查看<!DOCTYPEhtml><html> <head> <meta......
  • Java方法(可变参数)
    Jdk1.5开始,Java支持传递同类型的可变参数给一个方法在方法声明中,在指定参数类型后加一个省略号(...)一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通......
  • java中的自动拆装箱与缓存(Java核心技术阅读笔记)
    最近在读《深入理解java核心技术》,对于里面比较重要的知识点做一个记录!众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为......
  • JavaScript中的Promise详解
    我们了解Promise之前先了解一下什么是异步,因为Promise是用来处理异步操作的一、什么是异步异步(Asynchronous,async)是与同步(Synchronous,sync)相对的概念。总所周知,Jav......
  • Java方法
    流程控制基础1.用户交互Scanner定义:实现程序和人的交互,Scanner类可以来获取用户的输入基本语法 Scanners=newScanner(System.in); //创建Scanner对象通......
  • java框架——Spring(二)
    AOP简介AOP(AspectOrientedProgramming)面向切面编程,一种编程范式,指导开发者如何组织程序结构OOP(ObjectOrientedProgramming)面向对象编程作用:在不惊动原始设计的基......
  • java子类对父类继承的属性在不同修饰词下的访问权限
    父类中的属性和方法可以被子类继承子类中继承了父类中的属性和方法后,在子类中能不能直接使用这些属性和方法:和这些属性和方法原有的修饰符(publicprotecteddefaultpri......
  • 关于javaSE继承中super的考究
    在对父类非private属性的使用过程中super专门用来指代继承过来的属性,在子类没有与父类重名的情况下。实际功能与this并无二异packagegunjo.kirito.union.course;cla......