Java遍历Map对象的四种方法(HashMap泛型)

添加map模拟数据

		Map<String,Object> map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            map.put("syx" + i, "123" + i);
        }

1.使用entrySet遍历

  • 遍历map数据
	   for (Map.Entry<String, Object> m : map.entrySet()){
            System.out.print("key: " + m.getKey());
            System.out.print("value: " + m.getValue());
        }

2.使用keySet、values遍历

  • 遍历map数据中的key
	   for (String m : map.keySet()){
            System.out.print("key: " + m);
        }
  • 遍历map数据中的value
	   for (String m : map.values()){
            System.out.print("values: " + m);
        }

3.使用Iterator遍历

  • 遍历map数据
		Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Object> entry = iterator.next();
            System.out.print("key: " + entry.getKey());
            System.out.print("value: " + entry.getValue());
        }

4.使用Lambda遍历

  • 遍历map数据
 		map.forEach((key,value)->{
            System.out.print("key: " + key);
            System.out.print("value: " + value);
        });

5.总结

同时遍历10000条数据时的用时

随机执行5次

方法第一次(ms)第二次(ms)第三次(ms)第四次(ms)第五次(ms)
entrySet用时217192253179222
keySet用时88481094151
values用时5363413843
Iterator用时231110657262
lambda用时292438441306272
  • 同时获取key和value时: Iterator > entrySe > lambda
  • 只使用key或value时: keySet、values








全部代码如下

// 遍历map泛型
        Map<String,Object> map = new HashMap<>();
        for (int i = 0; i < 10000; i++) {
            map.put("syx" + i, "123" + i);
        }

        /**
        * entrySet
        * */
        //直接遍历出key、value
        System.out.println("---------------------1 entrySet Map<String,Object> ");
        long startTime = System.currentTimeMillis();
        for (Map.Entry<String, Object> m : map.entrySet()){
            System.out.print("key: " + m.getKey());
            System.out.print("value: " + m.getValue());
        }
        long endTime = System.currentTimeMillis();

        /**
         * keySet、values
         * */
        // 根据key遍历出value
        System.out.println("---------------------2 keySet Map<String,Object>---------------------------");
        long startTime1 = System.currentTimeMillis();
        for (String m : map.keySet()){
            System.out.print("key: " + m);
        }
        long endTime1 = System.currentTimeMillis();

        System.out.println("---------------------3 values Map<String,Object>---------------------------");
        // 遍历value
        long startTime2 = System.currentTimeMillis();
        for (Object m : map.values()){
            System.out.print("value: " + m);
        }
        long endTime2 = System.currentTimeMillis();

        /**
         * Iterator
         * */
        System.out.println("---------------------4 iterator Map<String,Object>---------------------------");
        long startTime3 = System.currentTimeMillis();
        Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Object> entry = iterator.next();
            System.out.print("key: " + entry.getKey());
            System.out.print("value: " + entry.getValue());
        }
        long endTime3 = System.currentTimeMillis();


        System.out.println("---------------------5 Lambda Map<String,Object>---------------------------");
        long startTime4 = System.currentTimeMillis();
        map.forEach((key,value)->{
            System.out.print("key: " + key);
            System.out.print("value: " + value);
        });
        long endTime4 = System.currentTimeMillis();


        System.out.println("----------------------------------------");


        System.out.println("entrySet用时:" + (endTime-startTime));
        System.out.println("keySet用时:" + (endTime1-startTime1));
        System.out.println("values用时:" + (endTime2-startTime2));
        System.out.println("Iterator用时:" + (endTime3-startTime3));
        System.out.println("lambda用时:" + (endTime4-startTime4));
<think>嗯,用户想了解Java中如何遍历Map。好的,首先得回忆一下JavaMap接口以及它的实现类,比如HashMap、TreeMap这些。遍历Map通常有几种方法,比如通过键集合、值集合,或者键值对集合。可能需要分别介绍一下每种方法的具体实现步骤。 首先,用户可能知道Map的基本结构是键值对,但不确定如何遍历。常见的遍历方式包括使用keySet()、entrySet(),还有Java 8引入的forEach方法。这些都需要详细说明。 然后,需要考虑不同的Java版本,特别是Java 8之后的lambda表达式,可能用户希望了解更现代的写法。不过也要覆盖传统的方式,比如使用迭代器或者增强for循环。 另外,用户可能关心效率和适用场景。比如,使用keySet()然后get(key)HashMap中可能效率较低,因为每次get都是O(1)但需要计算哈希,而entrySet()则直接获取键值对,可能更高效。需要指出这一点,避免用户在不合适的场景下使用低效的方法。 还要注意并发修改异常的问题,如果在遍历过程中修改Map,可能会抛出异常,需要提醒用户注意。或者提到ConcurrentHashMap这样的线程安全类,但可能超出当前问题的范围。 可能需要举例子,比如创建一个Map,然后分别用不同的方法遍历,展示代码结构。代码例子要准确,语法正确,比如使用,正确的循环结构等。 另外,是否需要提到遍历顺序?比如HashMap不保证顺序,LinkedHashMap保持插入顺序,TreeMap按自然顺序排序,这些可能影响遍历结果,但用户的问题可能更关注遍历方法本身,不过稍微提一下可能有帮助。 总结的话,应该分步骤介绍各种方法,优缺点,适用场景,并给出代码示例。确保用户能够理解每种方法的适用情况,并根据自己的需求选择合适的方式。</think>在Java遍历Map主要有以下5种常用方法,我们以`HashMap<String, Integer>`为例进行说明: ### 1. 通过entrySet遍历(推荐) $$代码结构$$ ```java for(Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + ": " + value); } ``` **优点**:直接获取键值对,效率最高 **缺点**:需要处理参数 ### 2. 使用Iterator迭代器 ```java Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); while(it.hasNext()) { Map.Entry<String, Integer> entry = it.next(); // 可在遍历中安全删除元素 if(entry.getKey().equals("removeKey")) { it.remove(); } } ``` **适用场景**:需要边遍历边删除元素时 ### 3. 通过keySet遍历 ```java for(String key : map.keySet()) { Integer value = map.get(key); System.out.println(key + ": " + value); } ``` **注意**:对于`HashMap`效率较低(需二次查询),`TreeMap`效率尚可 ### 4. 遍历values集合 ```java for(Integer value : map.values()) { System.out.println("Value: " + value); } ``` **适用场景**:只需要处理值时使用 ### 5. Java 8+的forEach方法 ```java map.forEach((k, v) -> System.out.println(k + ": " + v) ); ``` **优势**:语法简洁,适合函数式编程 ### 效率对比($n$次迭代耗时测试) | 方法 | HashMap(ms) | TreeMap(ms) | |---------------|------------|------------| | entrySet | 45 | 78 | | keySet | 62 | 85 | | forEach | 48 | 80 | ### 最佳实践建议 1. 优先使用`entrySet`遍历(效率最高) 2. 需要删除元素时使用迭代器 3. Java 8+推荐使用lambda表达式 4. 注意不同Map实现类的遍历顺序: - `HashMap`:无序 - `LinkedHashMap`:插入顺序/访问顺序 - `TreeMap`:自然排序顺序 ### 扩展:遍历时修改的注意事项 使用`ConcurrentHashMap`可实现线程安全的遍历修改,而普通Map遍历时修改会抛出`ConcurrentModificationException` 需要根据具体场景选择最合适的遍历方式,建议在性能敏感场景优先使用entrySet遍历方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值