zoukankan      html  css  js  c++  java
  • HashMap七种遍历的方法

    JDK 8 之前主要使用 EntrySet 和 KeySet 的遍历方式,而 KeySet 的遍历方式性能比较低,一般不推荐使用。然而在 JDK 8 之后遍历方式就有了新的选择,可以使用比较简洁的 Lambda 遍历,也可以使用性能比较高的 Stream 多线程遍历。

    1.JDK 8 之前的遍历

    class TestDemo{
        public static void main(String[] args) {
            // 创建并赋值 hashmap
            HashMap<String, String> map = new HashMap() {{
                put("Java", " Java Value.");
                put("MySQL", " MySQL Value.");
                put("Redis", " Redis Value.");
            }};
            //1.1 EntrySet 遍历
            for (Map.Entry<String, String> entry : map.entrySet()) {
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }
            //1.2 KeySet 遍历
            for (String key : map.keySet()) {
                System.out.println(key + ":" + map.get(key));
            }
            //1.3 EntrySet 迭代器遍历
            Iterator<Map.Entry<String, String>> entryIterator = map.entrySet().iterator();
            while (entryIterator.hasNext()) {
                Map.Entry<String, String> entry = entryIterator.next();
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }
            //1.4 KeySet 迭代器遍历
            Iterator<String> keySetIterator = map.keySet().iterator();
            while (keySetIterator.hasNext()) {
                String key = keySetIterator.next();
                System.out.println(key + ":" + map.get(key));
            }
        }
    }
    

      

    迭代器的作用

    如果在遍历的代码中动态删除元素,非迭代器的方式就会报错。如下:

       for (Map.Entry<String, String> entry : map.entrySet()) {
            if ("Java".equals(entry.getKey())) {
                // 删除此项
                map.remove(entry.getKey());
                continue;
            }
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    

      

     使用迭代删除:

      Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            if ("Java".equals(entry.getKey())) {
                // 删除此项
                iterator.remove();
                continue;
            }
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    

      

    2.JDK 8 之后的遍历

    class TestDemo{
        public static void main(String[] args) {
            // 创建并赋值 hashmap
            HashMap<String, String> map = new HashMap() {{
                put("Java", " Java Value.");
                put("MySQL", " MySQL Value.");
                put("Redis", " Redis Value.");
            }};
            //1.1 Lambda 遍历
            map.forEach((key,value)->{
                System.out.println(key + ":" + value);
            });
    //1.2 Stream 单线程遍历 // 循环遍历 //Stream 遍历是先得到 map 集合的 EntrySet,然后再执行 forEach 循环 map.entrySet().stream().forEach((entry) -> { System.out.println(entry.getKey() + ":" + entry.getValue()); });
    //1.3 Stream 多线程遍历 //Stream 多线程的遍历方式和上一种遍历方式类似,只是多执行了一个 parallel 并发执行的方法,此方法会根据当前的硬件配置生成对应的线程数,然后再进行遍历操作 //因为程序是并发执行的,所以没有办法保证元素的执行顺序和打印顺序,这就是并发编程的特点。 map.entrySet().stream().parallel().forEach((entry) -> { System.out.println(entry.getKey() + ":" + entry.getValue()); }); } }

     

    推荐使用哪种遍历方式?

    不同的场景推荐使用的遍历方式是不同的,例如,如果是 JDK 8 之后的开发环境,推荐使用 Stream 的遍历方式,因为它足够简洁;而如果在遍历的过程中需要动态的删除元素,那么推荐使用迭代器的遍历方式;如果在遍历的时候,比较在意程序的执行效率,那么推荐使用 Stream 多线程遍历的方式,因为它足够快。所以这个问题的答案是不固定的,我们需要知道每种遍历方法的优缺点,再根据不同的场景灵活变通。

    总结

    本文介绍了 7 种 HashMap 的遍历方式,其中 JDK 8 之前主要使用 EntrySet 和 KeySet 的遍历方式,而 KeySet 的遍历方式性能比较低,一般不推荐使用。然而在 JDK 8 之后遍历方式就有了新的选择,可以使用比较简洁的 Lambda 遍历,也可以使用性能比较高的 Stream 多线程遍历。

    MC❤涛
  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/aikutao/p/15723183.html
Copyright © 2011-2022 走看看