Map的几种迭代

在java中有很多种方法来遍历map。接下来我们就回顾下最常用的方法,并且比较下他们的优缺点。 各种map 在java中都实现了map接口,下面的方法适合任何一种map,只要是实现了map接口的。像hashmap,treemap,LinkeHashMap,Hashtable等等。
    
方法#1:通过通过循环entries 来遍历map
        这种方法是最通用和效率比较好的方法。适合同时需要map的key 和value的情况。

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

    由于foreach循环是在java5开始有的,所以这种方法适合比较新的版本。而且这个循环会抛空指针错误,如果你循环的map 为null,所以使用时候要检查是否为null.

方法#2  通过循环key和value 来遍历
如果你只是需要map的key或者values ,你可以循环遍历entrySet的keySet或者values
Map<Integer, Integer> map = new HashMap<Integer, Integer>();

//iterating over keys only
for (Integer key : map.keySet()) {
    System.out.println("Key = " + key);
}

//iterating over values only
for (Integer value : map.values()) {
    System.out.println("Value = " + value);
}

方法#3 使用迭代器 iterator

通常:

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

不寻常的:

Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry entry = (Map.Entry) entries.next();
    Integer key = (Integer)entry.getKey();
    Integer value = (Integer)entry.getValue();
    System.out.println("Key = " + key + ", Value = " + value);
}

你可以使用同样的方法去迭代keyset和values.

这种方法看起来很繁琐,但是他有他的优势。首先这个是唯一的使用老版本的map的迭代方法。其次这也是唯一一个允许在迭代过程中通过iterator.remove()来删除map中的数据。如果你试图在foreach方法中进行删除操作,你会得到预料不到的结果。

从性能方面来说,这个方法与foreach循环相当。

方法#4 通过遍历key来获取对应的value

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
    Integer value = map.get(key);
    System.out.println("Key = " + key + ", Value = " + value);
}
这个方法可以认为是方法#1的缩减版,但是从实际来看,这种方法是非常慢和效率低下的,因为通过key来获取value是比较耗时的。(这种方法对不同的map实现会比第一种方法慢20%--200%)。如何你有安装findbugs,你就可以检测到。鉴于效率来说,这个方法需要避免使用。

结论:

如何你只需要keys或者只需要values,使用方法#2.如果你是老的版本,并且有删除操作的使用方法#3。其他使用#1.
Map集合常见的遍历方式主要有以下几种: ### 键找值 先获取Map集合的全部键的Set集合,再遍历键的Set集合,然后通过键提取对应值。示例代码如下: ```java import java.util.HashMap; import java.util.Map; import java.util.Set; public class MapTraversalKeySet { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("key1", 1); map.put("key2", 2); Set<String> keys = map.keySet(); for (String key : keys) { Integer value = map.get(key); System.out.println(key + " ---> " + value); } } } ``` 这种方式是先遍历键的集合,再通过键去获取对应的值,适用于只需要键或者需要通过键获取值的场景,但在获取值时可能会有额外的查找开销[^1][^2]。 ### 键值对流程 先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型,再遍历Set集合,然后提取键以及提取值。示例代码如下: ```java import java.util.HashMap; import java.util.Map; import java.util.Set; public class MapTraversalEntrySet { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("key1", 1); map.put("key2", 2); Set<Map.Entry<String, Integer>> entries = map.entrySet(); for (Map.Entry<String, Integer> entry : entries) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + " ---> " + value); } } } ``` 该方式能直接获取键值对对象,在同时需要键和值的场景下效率较高,避免了通过键再次查找值的开销[^1]。 ### Lambda表达式 使用Lambda表达式可以更简洁地遍历Map集合。示例代码如下: ```java import java.util.HashMap; import java.util.Map; public class MapTraversalLambda { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("key1", 1); map.put("key2", 2); map.forEach((key, value) -> { System.out.println(key + " ---> " + value); }); } } ``` 这种方式代码简洁,适用于Java 8及以上版本,并且使用函数式编程的风格,提高了代码的可读性和简洁性[^1]。 ### 迭代器方式 使用迭代器遍历Map集合的键或键值对。示例代码如下: ```java import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class MapTraversalIterator { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("key1", 1); map.put("key2", 2); // 迭代键 Set<String> keys = map.keySet(); Iterator<String> keyIterator = keys.iterator(); while (keyIterator.hasNext()) { String key = keyIterator.next(); Integer value = map.get(key); System.out.println(key + " ---> " + value); } // 迭代键值对 Set<Map.Entry<String, Integer>> entries = map.entrySet(); Iterator<Map.Entry<String, Integer>> entryIterator = entries.iterator(); while (entryIterator.hasNext()) { Map.Entry<String, Integer> entry = entryIterator.next(); String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + " ---> " + value); } } } ``` 迭代器方式可以在遍历过程中进行元素的删除操作,而使用增强for循环等方式则不允许在遍历过程中修改集合结构。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值