Java面试知识点(四十九)Map集合 的遍历
Map接口提供三个集合视图:
(1)Set keyset():返回map中包含的所有key的一个Set视图。
(2)Collection values():返回一个map中包含的所有value的一个Collection视图。
(3)Set<Map.Entry<K,V>> entrySet():返回一个map钟包含的所有映射的一个集合视图。
第一种:KeySet()
将 Map 中所有的键存入到 set 集合中。因为 set 具备迭代器。所有可以迭代方式取出所有的键,再根据 get 方法。获取每一个键对应的值。 keySet (): 迭代后只能通过 get () 取 key 。
取到的结果会乱序,是因为取得数据行主键的时候,使用了 HashMap.keySet () 方法,而这个方法返回的 Set 结果,里面的数据是乱序排放的。
典型用法如下:
Map map = new HashMap(); map.put("key1","lisi1"); map.put("key2","lisi2"); map.put("key3","lisi3"); map.put("key4","lisi4"); // 先获取 map 集合的所有键的 set 集合,keyset() Iterator it = map.keySet().iterator(); // 获取迭代器 while(it.hasNext()){ Object key = it.next(); System.out.println(map.get(key)); }
第二种:entrySet()
Set<Map.Entry<K,V>> entrySet () // 返回此映射中包含的映射关系的 Set 视图。(一个关系就是一个键 - 值对),就是把 (key-value) 作为一个整体一对一对地存放到 Set 集合当中的。Map.Entry 表示映射关系。entrySet ():迭代后可以 e.getKey (),e.getValue () 两种方法来取 key 和 value。返回的是 Entry 接口。
典型用法如下:
Map map = new HashMap(); map.put("key1","lisi1"); map.put("key2","lisi2"); map.put("key3","lisi3"); map.put("key4","lisi4"); // 将 map 集合中的映射关系取出,存入到 set 集合 Iterator it = map.entrySet().iterator(); while(it.hasNext()){ Entry e =(Entry) it.next(); System.out.println ("键"+e.getKey () + "的值为" + e.getValue ()); }
推荐使用第二种方式,即 entrySet () 方法,效率较高。 对于 keySet 其实是遍历了 2 次,一次是转为 iterator,一次就是从 HashMap 中取出 key 所对于的 value。而 entryset 只是遍历了第一次,它把 key 和 value 都放到了 entry 中,所以快了。两种遍历的遍历时间相差还是很明显的。
public class MapIterator { public static void listMethod() { System.out.println("list 通过 iterator 遍历:"); List<Integer> list = new ArrayList<>(); for (int i=0; i<10; i++) { list.add(i); } Iterator iterator = list.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); } System.out.println(""); } public static void mapMethod() { System.out.println("map 通过 iterator 遍历:"); Map<String,String> map = new HashMap<>(); for (int i=0; i<10; i++) { map.put("key"+i,"value"+i); } Iterator iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); System.out.println("key: "+entry.getKey()+" value: "+entry.getValue()); } } public static void main(String[] args) { listMethod(); mapMethod(); } }
结果为: list 通过 iterator 遍历: 0 1 2 3 4 5 6 7 8 9 map 通过 iterator 遍历: key: key1 value: value1 key: key2 value: value2 key: key0 value: value0 key: key5 value: value5 key: key6 value: value6 key: key3 value: value3 key: key4 value: value4 key: key9 value: value9 key: key7 value: value7 key: key8 value: value8
可以看到hashmap遍历的结果是乱序的,在map集合中,treemap是有序的