作为Java初学者,在学习Set和Map时都会用到迭代器Iterator来遍历集合,其形式为
Iterator> it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
书上或视频教学上都是这么写的,没问题。可是我们在实际应用时发现,循环内部需要实现的不止是输出it.next(),还有其他的功能需求。比如我购物车中需要求商品的总价时,遍历集合时需要求得商品价格和商品数量的积,这时就需要调用getNumOfGoods()和getPrice()方法。代码如下:
这个时候运行结果为:
出异常了,(NoSuchElementException在 Iterator 接口的 next() 官网文档中有给出),为什么会出现这种异常呢?而且比较奇特的是如果迭代器中的元素个数为偶数时,不会出现这个异常,当然计算结果也是错的(大家可以自己动手试试)。这就要从next()这个方法本身入手。next()方法是返回跌代器中下一个元素,也就是每调用一次 next()方法,所返回的元素都是不同的。
上例中迭代器有三个元素:goods1、goods2、goods3。假设迭代器按这个顺序遍历元素:
第一次循环 hasNext() == true;
goodsIt.next().getNumOfGoods() 调用的是goods1中的numOfGoods
goodsIt.next().getPrice()调用的就是就是goods2中的price了
第一次循环的结果为 6000
第二次循环 hasNext() == true;(还有goods3,所以为true)
goodsIt.next().getNumOfGoods() 调用的是goods3中的numOfGoods
goodsIt.next().getPrice()则无元素可调用
第二次循环会出现异常:NoSuchElementException
所以会出现上图中的结果6000.0Exception。那偶数时为什么就不出现异常了呢?因为程序中有两个next()方法,假如迭代器中
只有两个元素 goods1 和 goods 2 ,那么第一次循环后,hasNext()为false,巧合的结束了循环,但是结果依然是6000.0(错误)。
那么我们想要遍历集合应该怎么办呢?可以使用强制循环(for-each循环)。