关于Map遍历和Iterator的keySet和entrySet

时间:2021-12-25 19:36:36

最近在写配置文件方面的程序,原本打算用map来存储相应的数据对,结果在编写过程中出现了问题,首先我们谈到map容器就不得不提及一下Java的collection类,里面包含了map,list,set和queue四种容器,每个容器下面又分为几种,link型的,tree型的,原始型的。这里就不在阐述了。对于遍历map来说采用Iterator方式遍历,其中Iterator方式中,有keySet方法和entrySet方法。keySet是按照关键字来建立set返回Object,entrySet是使用key和value建立set,返回Object类型,格式entry<? ?>.

两种方式遍历写法没有多大区别,就是将map转换为Iterator形式,Iterator it = map.keySet().iterator()和Iterator it = map.entrySet().iterator();两种方式的遍历有人做过比较,entrySet时间上是优于keySet的,还有一点就是map的key不能重复,但value可以,key的重复会冲掉前面插入的value,变为当前的value,而对于set来说是要覆盖掉相同的值。

前面累述了一大段,现在描述一下问题,即对it数据进行遍历的时候

Map<String, String> m=new HashMap<String, String>();
m.put("1", "111");
Iterator it=m.keySet().iterator();
while(it.hasNext()){
System.out.println(it.next.toString());
System.out.println(m.get(it.next.toString()));
}

发现我的map填充大小为1的时候,出现了noSuchElement的错误,看了一下代码没错啊,hasnext()判断,it.next()取值,就是会抛出错误,当填充的个数大于1时,问题就没有产生。最后上thinking in Java里面看了看,发现问题所在,即it.next()的实现,书里面讲到适配器模式实现foreach方法时,发现next方式是return get(current--);即对于map方式来说想要在一次循环得到key和value的对应值就有问题,也就会出现noSuchElement问题。因此对其进行更改

Map<String, String> m=new HashMap<String, String>();
m.put("1", "111");
m.put("3", "222");
m.put("2", "222");
m.put("4", "444");
m.put("5", "555");
Iterator it=m.keySet().iterator();
while(it.hasNext()){
String temp=it.next().toString();
System.out.println(temp);
System.out.println(m.get(temp));
}

解决上述问题,说明:如果采用entrySet()方式,则要取得map对还是可以的,因为entry存储是以key和value进行Set填充的。因此可以一次取出。并且对于原始的map来说,顺序是没有办法保证的。即加入map的顺序和遍历出map的顺序是不一致的。