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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章