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 或 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类型
文章最后发布于: 2018-07-05 09:47:01
相关阅读
论文解析 - SLAM++: Simultaneous Localisation and M
SLAM++: Simultaneous Localisation and Mapping at the Level of Objects 0. 论文概况 引用:331, CVPR2013 Renato F. Salas-Mor
produces在@requestMapping中的使用方式和作用
produces可能不算一个注解,因为什么呢,它是注解@requestMapping注解里面的属性项, 它的作用是指定返回值类型,不但可以设置返回值类型
准确率,召回率,mAP(mean average precision)解释
准确率Precision 召回率Recall 其实这个翻译相当蛋疼。。。 recall最合理的翻译应该是 查全率 而Precision的最合理的翻译应该是
作为一个java开发者肯定都知道且使用HashMap,但估计大部分人都不太知道WeakHashMap。从类定义上来看,它和普通的HashMap一样,继承了A
在最新的Hadoop(2.7以上版本)中,我们在控制台已经找不到jobtracker和tasktracker模块了,这并不是说它们消失了,而是隐式的加入了YARN框