Java面试知识点(四十九)Map集合 的遍历

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_33945246/article/details/96449657

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是有序的

猜你喜欢

转载自blog.csdn.net/qq_33945246/article/details/96449657