[Java基础]Map集合的遍历

Map集合是Java中非常常用的一个集合,通过Map集合可以实现对数据的快速检索和插入删除等操作;同样对Map集合的遍历也是十分重要的;如果你之前学过C++,那么对于Map的遍历操作可就不能像是C++那样通过下标遍历了;

这里我提供两种遍历Map集合的方式,以及性能和使用方式的比较;

通过key获取value

这种方式是获取Map的key值,通过 Map 的 get() 方法 获取对应的value值;

代码如下:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapTraverse01 {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>(); // 创建一个HashMap对象
        // 存入map
        map.put(1, "张三");
        map.put(2, "李四");
        map.put(3, "王五");
        map.put(4, "赵六");
        map.put(5, "小三");

        // 迭代器遍历
        Set<Integer> set = map.keySet(); // 获取key对应的Set集合
        Iterator<Integer> iterator = set.iterator(); // 通过迭代器遍历
        while (iterator.hasNext()) {
            Integer i = iterator.next();
            // 输出key并通过key输出value
            System.out.println("key:" + i + " value:" + map.get(i));
        }
        System.out.println("=================");

        // foreach循环
        for (Integer i : map.keySet()) {
            System.out.println("key:" + i + " value:" + map.get(i));
        }
        System.out.println("=================");
    }
}

输出如下:

key:1 value:张三
key:2 value:李四
key:3 value:王五
key:4 value:赵六
key:5 value:小三
=================
key:1 value:张三
key:2 value:李四
key:3 value:王五
key:4 value:赵六
key:5 value:小三
=================

这里我用了迭代器和foreach循环,至于它们的区别我会在文章最后详细介绍

接下来分析一下这种方法的效率;
我们通过 keySet() 方法获取到了所有的key值,并没有获取到value值,这意味着每次遍历时通过 get() 方法得到value值时都需要再次遍历Map集合,就相当于遍历了两次,第一次是对key的Set集合遍历,第二次是通过map.get(key)来获取value值;
一旦数据量大的时候,这种遍历方式的效率就会明显降低;

当然,如果数据量较小时还是比较推荐这种方法的;

同时获取key和Value

这种方法是同时获取到 key 和 value 值,这里就不再使用 keySet() 方法了,而是使用 entrySet() 获取Map中的key-value对;


这里还是简单介绍一下Map.Entry<K,V>接口

public static interface Map.Entry<K,V>

英语好的可以结合理解一下对Map.Entry<K,V>接口的介绍:

A map entry (key-value pair). The Map.entrySet method returns a collection-view of the map, whose elements are of this class. The only way to obtain a reference to a map entry is from the iterator of this collection-view. These Map.Entry objects are valid only for the duration of the iteration; more formally, the behavior of a map entry is undefined if the backing map has been modified after the entry was returned by the iterator, except through the setValue operation on the map entry.

其中这里我们只需要记住两种方法:
在这里插入图片描述
就是分别获取到key值和value值;

下面我将用代码示范一下第二种遍历方式:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapTraverse02 {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>(); // 创建一个HashMap对象
        // 存入map
        map.put(1, "张三");
        map.put(2, "李四");
        map.put(3, "王五");
        map.put(4, "赵六");
        map.put(5, "小三");

        // 迭代器
        Set<Map.Entry<Integer, String>> set = map.entrySet(); // 获取map中的key-value对
        Iterator<Map.Entry<Integer, String>> iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, String> i = iterator.next();
            // 这里必须定义局部变量,如果直接用迭代器获取key后迭代器就会前移,输出下一个value时就会到达下一个迭代的位置
            // System.out.println("key:" + iterator2.next().getKey() + " value:" + iterator2.next().getValue());
            // 上面这样不可以

            // 通过Entry内部类获取key和value
            System.out.println("key:" + i.getKey() + " value:" + i.getValue());
        }
        System.out.println("=================");

        // foreach循环
        for (Map.Entry<Integer, String> i : map.entrySet()) {
            System.out.println("key:" + i.getKey() + " value:" + i.getValue());
        }
        System.out.println("=================");
    }
}

输出如下:

key:1 value:张三
key:2 value:李四
key:3 value:王五
key:4 value:赵六
key:5 value:小三
=================
key:1 value:张三
key:2 value:李四
key:3 value:王五
key:4 value:赵六
key:5 value:小三
=================

这种遍历方式在数据量大的时候比第一种方式效率更高,因为是同时获取的key和value值,所以还是要根据实际情况对这两种遍历方法进行选择;

可能开始接触Map.Entry会有不适应,多用用就好了,以后可能会考虑为Map.Entry专门写一篇博客,在这里留个位;

迭代器遍历和foreach遍历的区别

这里简单说一下这两种遍历方式的区别;
迭代器遍历的效率会比foreach循环遍历的效率高一点,但是它们的主要区别并不在这里;

只需要记住一点:
如果用foreach循环体,那么对集合元素进行增删改操作的时候,
就会出现异常ConcurrentModificationException
所以foreach仅仅用来遍历输出还是方便的,但是不要用来修改集合的数据;

如果需要对集合进行增删改操作,那么就使用迭代器遍历,可以使用 iterator 的 remove()方法;

这里就不做示范了,感兴趣可以自己尝试;

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YXXYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值