之前学习集合的时候要通过迭代器来迭代的时候最难得就是map集合得迭代,一直也不太明白,今天总算搞懂了
首先我们看什么容器才能迭代
根据API我们得知是对所有collection迭代的集合,那么已知的collection容器有哪些
我把常用的标出了,我们接着看这些能容器如何迭代我们点进去,发现了collection容器有两种情况
拥有一个返回类型为Iterator的方法,我们通过这个方法得到迭代器
实现了Iterable接口,看看你这个接口
那么我们也可以调用这个方法拿到迭代容器迭代器。
但是我们发现collection接口的子接口没有Map接口,那么我们无法通过Map来直接获取迭代器。
接下来就是我们的重点了:
实现方法:
我们发现在Map集合中有这么一个方法:
我们先不要管Map.Entry
集体看下这个方法的描述:
Set
视图。该 set 受映射支持,所以对映射的更改可在此 set 中反映出来,反之亦然。如果对该 set 进行迭代的同时修改了映射(通过迭代器自己的
remove 操作,或者通过对迭代器返回的映射项执行
setValue 操作除外),则迭代结果是不确定的。set 支持元素移除,通过
Iterator.remove、
Set.remove、
removeAll、
retainAll 和
clear 操作可从映射中移除相应的映射关系。它不支持
add 或
addAll 操作。
我们发现返回一个set集合,并且这个set可以对映射支持,就是你在map集合的改动,在这个set集合中也可以反映出来
那么就是说这个方法把我们的map的每个键值对都当作一个对象存入了set集合中。那么我们就可以用set集合来迭代这个map的所有值。
我们发现这个方法返回类型的泛型是Map.Entry
看下Entry的接口说明
接口 Map.Entry
所有已知实现类:
AbstractMap.SimpleEntry, AbstractMap.SimpleImmutableEntry
正在封闭接口:
Map
public static interface Map.Entry映射项(键-值对)。Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。这些 Map.Entry 对象仅 在迭代期间有效;更确切地讲,如果在迭代器返回项之后修改了底层映射,则某些映射项的行为是不确定的,除了通过 setValue 在映射项上执行操作之外。
用了entry
Map map=new HashMap();//这样没有问题
map.put(1, 1);
Set set = map.entrySet();
Iterator 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类型