你有没有掉进去过这些 迭代器 的 “陷阱“

一、迭代数组或集合时的 ”陷阱“

对于集合和数组的迭代,最常用的方式就是使用 for 循环迭代器 进行迭代。新建一个 Maven 项目 iterator-traps, 添加 junit 依赖。

xml
复制代码
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

在 test 包下创建测试类 com.traps.IterationTest,用于测试 for 循环 迭代和 迭代器 迭代

for 循环迭代

当需要对一个数组进行遍历的时候,可以使用 for 循环通过数组长度,建立索引来实现迭代

java
复制代码
public class IterationTest {

    @Test
    public void testForeachByUsingIndex(){
        int[] items = new int[]{1,2,3,4};

        for (int i = 0; i < items.length; i++) {
            System.out.println(items[i]);
        }
    }
}

执行上述代码,输出结果如下:

txt
复制代码
1
2
3
4

for 循环可以非常简单的通过索引来循环获取数组中的每一个元素。

迭代器迭代

迭代器 Iterator 是一种用于访问集合的方法,可以用于迭代集合,Iterator 接口是 Java 迭代器中最简单的实现,Java 中的集合 Collection 接口都有一个 iterator() 方法,该方法可以返回一个 Iterator 对象,Iterator 对象本身并不存放任何元素或者对象。

迭代器 模式提供了一种方法来顺序访问一个聚合对象中的各个元素,而不保留该对象的内部表示,迭代器模式是一种对象行为型模式,其主要优点如下:

  • 访问一个聚合对象的内容而无须暴露它的内部表示。
  • 将遍历任务交由迭代器完成,简化了聚合类。
  • 支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
  • 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
  • 封装性良好,为遍历不同的聚合结构提供一个统一的接口。

在 IterationTest 测试类中增加测试方法 testIterateCollections

java
复制代码
public class IterationTest {

    // 其余代码保持不变 
    
    private static Collection<String> zulu = Arrays.asList("Seal A", "Seal B", "Seal C", "Seal D");

    private static Collection<String> yankee = Arrays.asList("Seal Z", "Seal Y", "Seal X", "Seal W", "Seal V");

    @Test
    public void testIterateCollections(){
        for (Iterator<String> items = yankee.iterator(); items.hasNext();){
            System.out.println(items.next());
        }
    }

}

执行上述代码,输出记过如下:

txt
复制代码
Seal Z
Seal Y
Seal X
Seal W
Seal V

但是当嵌套迭代两个集合时,会出现异常

java
复制代码
@Test
public void testNestIterateCollections(){
    for (Iterator<String> items = yankee.iterator(); items.hasNext();){
        for (Iterator<String> eles = zulu.iterator(); eles.hasNext();){
            System.out.println(items.next() + " " + eles.next());
        }
    }
}

执行上述代码,输出记过如下:

txt
复制代码
Seal Z Seal A
Seal Y Seal B
Seal X Seal C
Seal W Seal D
Seal V Seal A

java.util.NoSuchElementException
	at java.util.AbstractList$Itr.next(AbstractList.java:364)
        .....................

这是应为对于外部集合来说, next 调用次数太多,导致集合中的元素已经迭代完了还在调用 next,应该是在外部循环中调用 next 而不是在内嵌的循环中调用最外层迭代器的 next。

修改 testNestIterateCollections 方法

java
复制代码
@Test
public void testNestIterateCollections(){

    for (Iterator<String> items = yankee.iterator(); items.hasNext();){
        String code= items.next();
        for (Iterator<String> eles = zulu.iterator(); eles.hasNext();){
            System.out.println(code + " " + eles.next());
        }
    }
}

执行上述代码,输出结果如下:

image.png

这里给大家分享一份Python全套学习资料,包括学习路线、软件、源码、视频、面试题等等,都是我自己学习时整理的,希望可以对正在学习或者想要学习Python的朋友有帮助!

CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
上述所有资料 ⚡️ ,朋友们如果有需要 📦《全套Python学习资料》的,可以扫描下方二维码免费领取 🆓
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

  • 38
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值