foreach 循环详解


考虑如下代码(方式一):迭代一个 collection 集合对象,然后删除集合元素
void cancelAll(Collection<TimerTask> c) {
    for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); )
        i.next().cancel();
}
以上迭代方式很丑陋,你知道,为什么丑陋?你看迭代器i 出现了3次,增加了我们出错几率,而且代码如此杂乱,我们看如下代码(方式二foreach 结构),它摒弃了这种丑陋。
void cancelAll(Collection<TimerTask> c) {
    for (TimerTask t : c)
        t.cancel();
}
利用方式一迭代 collection 集合对象 通常犯的错误,荔枝代码如下:
List suits = ...;
List ranks = ...;
List sortedDeck = new ArrayList();

// BROKEN - throws NoSuchElementException!
for (Iterator i = suits.iterator(); i.hasNext(); )
    for (Iterator j = ranks.iterator(); j.hasNext(); )
        sortedDeck.add(new Card(i.next(), j.next()));
为什么报错? 当 ranks 的size 大于 suits.size 的时候,第3行中的 i.next() 就会抛出 NoSuchElementException 异常。

修改后的代码如下(利用临时变量 保存Suit实例,但代码还是那么杂乱无章):
// Fixed, though a bit ugly
for (Iterator i = suits.iterator(); i.hasNext(); ) {
    Suit suit = (Suit) i.next();
    for (Iterator j = ranks.iterator(); j.hasNext(); )
        sortedDeck.add(new Card(suit, j.next()));
}
我们看foreach 结构如何实现
for (Suit suit : suits)
    for (Rank rank : ranks)
        sortedDeck.add(new Card(suit, rank));
等等 foreach结构还可以应用到数组的遍历
// Returns the sum of the elements of a
int sum(int[] a) {
    int result = 0;
    for (int i : a)
        result += i;
    return result;
}
最后:我们什么时候不能用 foreach结构 迭代集合元素呢?
case1:程序需要访问迭代器 然后移除当前元素的时候;因为foreach 结构隐藏了 迭代器,所以无法调用remove() 方法;
case2:foreach 结构不适用于 过滤 同样也不适用于 遍历过程中替换元素的操作。
case3:最后,foreach结构 不适用于同时并行遍历 多个 集合元素。

虽然 foreach结构有以上缺点,但是它的应用可以覆盖掉大多数的情况需要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值