Java Collection(8)——Map的遍历方式
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,内存占用较少
缺点:如果需要同时访问key和value,可以遍历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<Integer>集合时,不能对该集合进行修改
如果想在遍历的过程中对Set集合进行修改,需要使用迭代器进行遍历,并且显式地调用迭代器地remove()方法
注意三:当使用迭代器遍历Set<Integer>集合时,需要正确使用,上面的代码是正确用法,下面来展示一些错误案例
案例一:
因为调用next()方法会产生两个效果:
1.获取到迭代器当前指向的元素
2.迭代器指向下一个元素
案例二:
2.2 entrySet()
作用:返回Set<Map.Entry<K,V>>视图,即键值对集合
用途:用于遍历Map中的所有键值对
优点:一次性获取键和值,避免频繁调用get(Object key)方法,在同时访问键和值的场景下,性能高于keySet()方法
缺点:返回的试图包含Map.Entry<K,V>对象,内存开销较大
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< V >视图,即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());}
}