写点什么

[Java 基础]Map 集合的遍历

  • 2022 年 5 月 15 日
  • 本文字数:1595 字

    阅读完需:约 5 分钟

这里我用了迭代器和 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:小三


== 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ===============


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

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
[Java基础]Map集合的遍历_Java_爱好编程进阶_InfoQ写作社区