前言
Map集合的遍历与List和Set集合不同。Map有两组值,因此遍历时可以只遍历值的集合,也可以只遍历键的集合,也可以同时遍历。Map以及实现Map类的接口(如HashMap\TreeMap\LinkedHashMap\Hashtable等)都可以用以下几种方式遍历。
获得键值对
根据键值对来找键和值。
- 通过map.entrySet()方法可以获取所有的key-value集合。
- 遍历该集合,获取每一个键值对对象。
- 由键值对对象,获取key键和value值。分别用entry.getkey()方法和entry.getValue()方法。
public class TestMain {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("abx","sgc");
map.put("okl","cut");
map.put("xgs","okd");
for(Map.Entry<String,String> entry:map.entrySet()){
String mapkey=entry.getKey();
String mapValue=entry.getValue();
System.out.println(mapkey+":"+mapValue);
}
}
}
只获得key或者value
不需要遍历整个键值对,只需要单纯的遍历键或者值。用map.values()方法或者map.keySet()方法。
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("abx","sgc");
map.put("okl","cut");
map.put("xgs","okd");
for (String key:map.keySet()) {
System.out.println(key);
}
for (String value:map.values()) {
System.out.println(value);
}
}
根据key找value
通过键找值遍历,这种方式的效率比较低,因为本身从键取值是比较耗时的操作。
- 获取所有的 key集合。map.ketSet()
- 遍历key集合。
- 根据key到集合中去找value。map.get(key)
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put("abx","sgc");
map.put("okl","cut");
map.put("xgs","okd");
for(String key:map.keySet()){
String value=map.get(key);
System.out.println(key+":"+value);
}
}
迭代器遍历(Iterator)
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put("abx","sgc");
map.put("okl","cut");
map.put("xgs","okd");
Iterator<Map.Entry<String,String>> entries=map.entrySet().iterator();
while(entries.hasNext()){
Map.Entry<String,String> entry=entries.next();
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+":"+value);
}
}
总结
在《阿里巴巴Java开发手册》中,有一条规约:【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。 说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。 如图:
一般情况下,遍历Map集合时,用entrySet()同时遍历出键值对,效率更高。
文章参考: https://blog.csdn.net/HaHa_Sir/article/details/83310848
|