JAVA – 遍历Map的方式

07/12/2019

一、Entry

由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系。
Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对也就是一个Entry)
Map.Entry里面包含getKey()和getValue()方法

Iterator<Map.Entry<Integer, Integer>> it=map.entrySet().iterator();
while(it.hasNext()) {
 Map.Entry<Integer,Integer> entry=it.next();
 int key=entry.getKey();
 int value=entry.getValue();
 System.out.println(key+" "+value);
}

 

二、entrySet

entrySet是 java中 键-值 对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。
entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V。
用来遍历map的一种方法,通过getKey()得到K,getValue()得到V。

Set<Map.Entry<String, String>> entrySet=map.entrySet();
for (Map.Entry<String, String> entry:entrySet) {
 System.out.println(entry.getKey()+","+entry.getValue());
}

 

三、keySet

keySet是键的集合,Set里面的类型即key的类型

Set<String> set = map.keySet();
for (String s:set) {
 System.out.println(s+","+map.get(s));
}

 

四、values

取得Map的values,但此种取不到key的值,仅能取得value的值

for (String v : map.values()) {
 System.out.println("value= " + v);
}

 

实例:

public static void main(String[] args) {

 Map<String, String> map = new HashMap<String, String>();
 map.put("1", "value1");
 map.put("2", "value2");
 map.put("3", "value3");

 // 第一种
 System.out.println("通过Map.entrySet使用iterator遍历key和value:");
 Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
 while (it.hasNext()) {
   Map.Entry<String, String> entry = it.next();
   System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
 }

 // 第二种:推荐,尤其是容量大时
 System.out.println("通过Map.entrySet遍历key和value");
   for (Map.Entry<String, String> entry : map.entrySet()) {
   System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
 }

 // 第三种:二次取值
 System.out.println("通过Map.keySet遍历key和value:");
 for (String key : map.keySet()) {
   System.out.println("key= "+ key + " and value= " + map.get(key));
 }

 // 第四种
 System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
 for (String v : map.values()) {
   System.out.println("value= " + v);
 }
}

 

结论:

一般来讲使用entrySet的方式(即第二种)进行遍历是效率最高的,因为hashMap内部的存储结构就是基于Entry的数组,在用这种方式进行遍历时,只需要遍历一次即可。而使用其他方式的时间复杂度可能会提高,例如:keySet方式,每次都需要通过key值去计算对应的hash,然后再通过hash获取对应的结果值,因此效率较低