1. 程式人生 > >Map集合的entrySet()方法

Map集合的entrySet()方法

之前學習集合的時候要通過迭代器來迭代的時候最難得就是map集合得迭代,一直也不太明白,今天總算搞懂了

首先我們看什麼容器才能迭代

根據API我們得知是對所有collection迭代的集合,那麼已知的collection容器有哪些


我把常用的標出了,我們接著看這些能容器如何迭代我們點進去,發現了collection容器有兩種情況

第一:

擁有一個返回型別為Iterator的方法,我們通過這個方法得到迭代器

第二:

實現了Iterable介面,看看你這個介面


那麼我們也可以呼叫這個方法拿到迭代容器迭代器。

但是我們發現collection介面的子介面沒有Map介面,那麼我們無法通過Map來直接獲取迭代器。

接下來就是我們的重點了:

實現方法:

我們發現在Map集合中有這麼一個方法:


我們先不要管Map.Entry<K,V>,看起來它就是一個泛型,對我們影響不大。

集體看下這個方法的描述:


返回此對映中包含的對映關係的 Set 檢視。該 set 受對映支援,所以對對映的更改可在此 set 中反映出來,反之亦然。如果對該 set 進行迭代的同時修改了對映(通過迭代器自己的 remove 操作,或者通過對迭代器返回的對映項執行 setValue 操作除外),則迭代結果是不確定的。set 支援元素移除,通過 Iterator.removeSet.removeremoveAllretainAllclear 操作可從對映中移除相應的對映關係。它不支援 add
addAll 操作。
返回:
此對映中包含的對映關係的 set 檢視

我們發現返回一個set集合,並且這個set可以對對映支援,就是你在map集合的改動,在這個set集合中也可以反映出來

那麼就是說這個方法把我們的map的每個鍵值對都當作一個物件存入了set集合中。那麼我們就可以用set集合來迭代這個map的所有值。

我們發現這個方法返回型別的泛型是Map.Entry<k,v>,我們看下是什麼。

看下Entry的介面說明

介面 Map.Entry<K,V>
所有已知實現類: 
AbstractMap.SimpleEntry, AbstractMap.SimpleImmutableEntry 
正在封閉介面:
Map<K,V> 


public static interface Map.Entry<K,V>對映項(鍵-值對)。Map.entrySet 方法返回對映的 collection 檢視,其中的元素屬於此類。獲得對映項引用的唯一 方法是通過此 collection 檢視的迭代器來實現。這些 Map.Entry 物件僅 在迭代期間有效;更確切地講,如果在迭代器返回項之後修改了底層對映,則某些對映項的行為是不確定的,除了通過 setValue 在對映項上執行操作之外。

用了entry

Map map=new HashMap();//這樣沒有問題
		map.put(1, 1);
        Set<Entry> set = map.entrySet();	
       Iterator<Entry> it=set.iterator();
        while(it.hasNext()) {
        	Entry map1=it.next();
        	System.out.println(map1);
        }
        for(Entry en:set)
        {
        	System.out.println(en);
        	System.out.println(en.getKey());
        	System.out.println(en.getValue());
        }

沒用entry

	public static void main(String[] args) throws CloneNotSupportedException {
		Map map=new HashMap();
		map.put(1, 1);
        Set set = map.entrySet();	
       Iterator it=set.iterator();
        while(it.hasNext()) {
        	Object map1=it.next();
        	System.out.println(map1);
        }
        for(Object en:set)
        {
        	System.out.println(en);
        
        } 
	}

這兩種方法都可以,只是第一種規定了Entry泛型,這個泛型物件相當於包裝了鍵值對的物件,用這個物件可以使用裡面的getKey和getValue方法,所以我們使用這個泛型對map操作

也就是說entrySet返回一個儲存鍵值對的set集合,如果設定這個set物件接受的物件型別是Entry型別,那麼可以使用Entry接口裡的getKey和getValue方法。也就是Entry介面例項化的類的物件可以用來更好的操作map型別