> 技术文档 > Java Collection(8)——Map的遍历方式_遍历 concurrenthashmap

Java Collection(8)——Map的遍历方式_遍历 concurrenthashmap


1.前言

Map是一个接口,这意味着它不能直接实例化对象,必须要通过具体的实现类来实例化对象。Map接口的实现类有:

HashMap,Treemap(Java
Collection(6)——Map&Set)

HashTable,ConcurrentMap( JAVA EE(10)——线程安全——synchronized &
JUC(java.util.concurrent) 的常见类 &
线程安全的集合类)

2.Map的遍历方式

以下的遍历方式适用于所有的Map实现类

2.1 keySet()

作用:返回一个Set视图,该集合包含Map中的所有key
用途:一般适用于只需要键(key)的场景
优点:返回的视图只包含key,内存占用较少
缺点:如果需要同时访问keyvalue,可以遍历Set集合的同时拿到key,再使用public V get(Object key)方法拿到value,这样就完成了对键值对的遍历,但是每访问一个key都需要调用get(Object key)方法,这可能会一定程度上影响性能

public static void main(String[] args) { HashMap<Integer,String> map = new HashMap<>(); map.put(1,\"A\"); map.put(2,\"B\"); map.put(3,\"C\"); //使用foreach遍历 Set<Integer> integers = map.keySet(); for (Integer integer : integers){ System.out.println(integer + \" \" + map.get(integer)); } System.out.println(\"=========================================================\"); //使用迭代 Iterator<Integer> iterator = map.keySet().iterator(); while (iterator.hasNext()){ Integer next = iterator.next(); System.out.println(next + \" \" + map.get(next)); }}

注意一:keySet()方法返回的是一个视图,并不是一个独立的集合(没有new一个集合),,这意味着对keySet的修改会影响到原始的Map

在这里插入图片描述

注意二:使用foreach遍历Set集合时,不能对该集合进行修改

在这里插入图片描述
如果想在遍历的过程中对Set集合进行修改,需要使用迭代器进行遍历,并且显式地调用迭代器地remove()方法
在这里插入图片描述

注意三:当使用迭代器遍历Set集合时,需要正确使用,上面的代码是正确用法,下面来展示一些错误案例

案例一:
在这里插入图片描述

因为调用next()方法会产生两个效果:
1.获取到迭代器当前指向的元素
2.迭代器指向下一个元素
在这里插入图片描述
案例二:
在这里插入图片描述
在这里插入图片描述

2.2 entrySet()

作用:返回Set<Map.Entry>视图,即键值对集合
用途:用于遍历Map中的所有键值对
优点:一次性获取键和值,避免频繁调用get(Object key)方法,在同时访问键和值的场景下,性能高于keySet()方法
缺点:返回的试图包含Map.Entry对象,内存开销较大

public static void main(String[] args) { HashMap<Integer,String> map = new HashMap<>(); map.put(1,\"A\"); map.put(2,\"B\"); map.put(3,\"C\"); //使用foreach遍历 Set<Map.Entry<Integer, String>> entries = map.entrySet(); for (Map.Entry<Integer, String> entry : entries){ System.out.println(entry); } System.out.println(\"=========================================================\"); //使用迭代器 final Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); }}

2.3 values()

作用:返回Collection视图,即value的集合
用途:用于遍历Map中的所有value
缺点:无法访问value对应的key
优点:在只需要访问value的场景下,性能较高

public static void main(String[] args) { HashMap<Integer,String> map = new HashMap<>(); map.put(1,\"A\"); map.put(2,\"B\"); map.put(3,\"C\"); //使用foreach遍历 Collection<String> values = map.values(); for (String s : values){ System.out.println(s); } System.out.println(\"=========================================================\"); //使用迭代器 Iterator<String> iterator = map.values().iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); }}