关于Map遍历和Iterator的keySet和entrySet

最近在写配置文件方面的程序,原本打算用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的顺序是不一致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值