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.remove、Set.remove、removeAll、retainAll 和 clear 操作可從對映中移除相應的對映關係。它不支援 add - 返回:
- 此對映中包含的對映關係的 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型別