Map集合【重点】

Map接口是一个存储键值对的数据结构,不允许重复的键,每个键最多对应一个值。常见的实现类有HashMap和TreeMap。接口提供了put,putAll,remove等操作,以及size,isEmpty,get等查询方法。entrySet()方法用于获取所有键值对的集合。

1.1 Interface Map <K,V> key 键 value 值

是一个接口;

是一个双边队列 存的是键值对的数据

将键映射到值得对象,地图不能包含重复的键;每个键可以映射到最多一个值

Map接口下面已经封装好的实现类:

HashMap TreeMap

Map接口下的方法:

增:

v put (K key , V value):

将指定的值与该映射中的指定键相关联(可选操作)

void putAll (Map <?extends K ,? extends V>m):

将指定地图的所有映射复制到此映射(可选操作)

删:

V remove (K key); 通过键删除指定的值,返回值是被删除的值

改:

V put (K key , V value) 当键没有的话,就是添加,没有的话,就是覆盖

 

查:

int size (); 查看集合中的元素的个数

boolean isEmpty();判断集合是否为空

boolean containsKey(Object key) ; 判断集合中是否包含这个键

boolean containsValue(Object Value) ; 判断集合中是否包含这个键

重要的方法:

V get(K key); 通过建获取值

Set<k> keySet() 获取所有的键存到set集合中

Collection<v> valles() 获取所有集合中的值

set<Map.Entry<K,V>> entrySet () 将键值对 的map的实体存到set集合中

 

 Map集合套List集合:

 

<think>我们之前讨论的是List集合的Stream遍历,现在用户的新问题是关于Map集合的遍历,特别是使用Stream API的方法。同时,用户提供了引用[1],其中展示了使用Map的forEach方法和Lambda表达式进行遍历的示例。但用户可能希望了解更多的遍历方式,尤其是Stream API的方式。 在Java中,Map集合的遍历有多种方式,包括传统的entrySet迭代、keySet遍历,以及Java 8引入的Lambda表达式和Stream API。由于用户特别提到Stream API,我们将重点放在如何使用Stream API遍历Map上。 注意:Map本身不是Collection,因此没有直接的stream()方法。但我们可以通过entrySet()、keySet()或values()来获取Set或Collection,然后转换成流。 以下是几种常见的Map遍历方法,包括Stream API的方式: 1. 使用Map的forEach方法(Lambda表达式): 这是最简单的方式,如引用[1]所示。 2. 使用entrySet().stream()遍历键值对: 我们可以将Map的entrySet转换成流,然后对每个Entry进行操作。 3. 单独遍历键或值: 使用keySet().stream()或values().stream()。 4. 使用Stream API进行过滤、映射等操作。 下面我们详细说明: 假设有一个MapMap<String, Integer> map = new HashMap<>(); map.put("one", 1); map.put("two", 2); map.put("three", 3); 方法1:使用Map.forEach(推荐用于简单遍历) map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value)); 方法2:使用entrySet().stream()(适用于需要流操作的情况) map.entrySet().stream() .forEach(entry -> System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue())); 方法3:使用keySet().stream()遍历键,然后通过键获取值(注意:如果Map是并发修改的,可能不安全,但一般遍历安全) map.keySet().stream() .forEach(key -> System.out.println("Key: " + key + ", Value: " + map.get(key))); 方法4:只遍历值 map.values().stream().forEach(value -> System.out.println("Value: " + value)); 此外,我们还可以在流中加入中间操作,例如过滤: // 只打印值大于1的条目 map.entrySet().stream() .filter(entry -> entry.getValue() > 1) .forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue())); 关于并行流:同样可以使用parallelStream(),但要注意线程安全和顺序问题。 注意事项: - 如果只需要键或值,使用keySet或values方法更直接。 - 如果需要同时使用键和值,推荐使用entrySet(避免多次查找)。 - 在流操作中,如果涉及到修改外部变量,需要保证线程安全(比如使用并发容器或避免修改)。 下面我们编写一个完整的示例代码:</think>### Java Map集合遍历方法详解 在Java中遍历Map集合有多种方式,以下是主流方法(含Stream API): #### 1. **Lambda表达式遍历(推荐)** ```java Map<String, Integer> map = new HashMap<>(); map.put("one", 1); map.put("two", 2); map.put("three", 3); // 直接遍历键值对 map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value) ); ``` **特点**: - 最简洁的遍历方式(Java 8+) - 直接访问键值对,无需转换 - 支持方法引用:`map.forEach(System.out::println)`[^1] #### 2. **Stream API遍历(含过滤/转换)** ```java // 基本遍历 map.entrySet().stream() .forEach(entry -> System.out.println(entry.getKey() + "=" + entry.getValue()) ); // 带条件过滤 map.entrySet().stream() .filter(entry -> entry.getValue() > 1) // 值大于1的条目 .map(entry -> entry.getKey().toUpperCase()) // 键转大写 .forEach(System.out::println); // 输出: TWO, THREE ``` #### 3. **传统遍历方法** ```java // 遍历键值对(EntrySet) for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } // 仅遍历键(KeySet) for (String key : map.keySet()) { System.out.println("Key: " + key); } // 仅遍历值(Values) for (Integer value : map.values()) { System.out.println("Value: " + value); } ``` #### 4. **迭代器遍历** ```java Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Integer> entry = it.next(); if (entry.getKey().equals("two")) { it.remove(); // 安全删除元素 } } ``` ### 性能对比与选择建议 | 方法 | 适用场景 | 性能特点 | |---------------------|---------------------------------|-----------------------| | `map.forEach()` | 简单遍历(推荐) | 最优,直接访问底层实现 | | Stream API | 需要过滤/转换/并行处理 | 中等,链式操作更灵活 | | EntrySet循环 | 需要修改元素或兼容老版本Java | 较高 | | KeySet循环 | 只需访问键 | 较低(需二次get查询) | > **最佳实践**: > - 纯遍历使用`map.forEach()` > - 数据处理使用Stream API > - 修改元素使用迭代器或EntrySet循环 > - 并行处理使用`map.entrySet().parallelStream()`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值