Java中Map集合遍历的多种实现方式

Map集合是Java中非常重要的数据结构,它存储键值对(key-value)。Java提供了多种遍历Map集合的方式,下面我将详细介绍各种实现方法。

图片[1]_Java中Map集合遍历的多种实现方式_知途无界

1. 使用keySet()遍历(遍历键)

Map<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Orange", 3);

// 遍历键
for (String key : map.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}

特点

  • 先获取所有键的集合
  • 通过键获取对应的值
  • 时间复杂度较高(O(n)),因为需要额外调用get()方法

2. 使用values()遍历(遍历值)

// 遍历值
for (Integer value : map.values()) {
    System.out.println("Value: " + value);
}

特点

  • 只获取值,不获取键
  • 适用于只需要值的场景

3. 使用entrySet()遍历(推荐方式)

// 最佳方式:同时获取键和值
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

特点

  • 同时获取键和值
  • 性能最好,直接访问键值对
  • 推荐使用的方式

4. 使用迭代器遍历entrySet()

Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Integer> entry = iterator.next();
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

特点

  • 适用于需要在遍历过程中删除元素的场景
  • 提供remove()方法安全删除当前元素

5. Java 8+的forEach方法(Lambda表达式)

// 使用forEach和Lambda表达式
map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));

// 或者使用方法引用
map.forEach(System.out::println); // 需要重写toString()或自定义打印方式

特点

  • 代码简洁
  • 适用于Java 8及以上版本
  • 可以结合Stream API进行更复杂的操作

6. 使用Stream API(Java 8+)

// 转换为流处理
map.entrySet().stream()
   .forEach(entry -> System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()));

// 过滤操作示例
map.entrySet().stream()
   .filter(entry -> entry.getValue() > 1)
   .forEach(entry -> System.out.println("Filtered: " + entry.getKey()));

特点

  • 支持链式操作
  • 可以方便地进行过滤、排序等操作
  • 适用于复杂的数据处理场景

7. 使用Java 8的keySet().forEach()和values().forEach()

// 遍历键
map.keySet().forEach(key -> System.out.println("Key: " + key));

// 遍历值
map.values().forEach(value -> System.out.println("Value: " + value));

特点

  • 简洁的语法
  • 但不如entrySet()方式高效

性能比较

  1. entrySet()方式性能最好,因为它直接访问键值对
  2. keySet()方式需要额外调用get()方法获取值,性能稍差
  3. values()方式只遍历值,性能与entrySet()相当,但不获取键

实际应用建议

  • 大多数情况下:使用entrySet()配合增强for循环或Java 8的forEach
  • 需要过滤/映射时:使用Stream API
  • 需要删除元素时:使用迭代器
  • 简单打印时:可以使用Java 8的forEach简化代码

完整示例

import java.util.*;
import java.util.stream.Collectors;

public class MapTraversalExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Orange", 3);
        map.put("Pear", 4);

        // 1. 使用keySet()遍历
        System.out.println("=== Using keySet() ===");
        for (String key : map.keySet()) {
            System.out.println(key + " -> " + map.get(key));
        }

        // 2. 使用values()遍历
        System.out.println("\n=== Using values() ===");
        for (Integer value : map.values()) {
            System.out.println("Value: " + value);
        }

        // 3. 使用entrySet()遍历(推荐)
        System.out.println("\n=== Using entrySet() ===");
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }

        // 4. 使用迭代器
        System.out.println("\n=== Using Iterator ===");
        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Integer> entry = iterator.next();
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }

        // 5. Java 8 forEach
        System.out.println("\n=== Using Java 8 forEach ===");
        map.forEach((k, v) -> System.out.println(k + " -> " + v));

        // 6. Stream API
        System.out.println("\n=== Using Stream API ===");
        map.entrySet().stream()
           .forEach(entry -> System.out.println(entry.getKey() + " -> " + entry.getValue()));

        // 7. 带条件的Stream操作
        System.out.println("\n=== Filtered Stream ===");
        map.entrySet().stream()
           .filter(entry -> entry.getValue() > 2)
           .forEach(entry -> System.out.println(entry.getKey() + " -> " + entry.getValue()));
    }
}

选择哪种遍历方式取决于具体需求,但在大多数情况下,使用entrySet()配合增强for循环或Java 8的forEach方法是最佳选择。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞76 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容