广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java迭代器与Collection接口超详细讲解
  • 175
分享到

Java迭代器与Collection接口超详细讲解

2024-04-02 19:04:59 175人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录关于迭代器你都知道什么?什么是迭代器?迭代器的4个api如何使用迭代器?Collection集合接口知多少?为什么不使用数组而是集合?Collection接口的API都有什么?A

关于迭代器你都知道什么?

什么是迭代器?

  所谓迭代的意思就是交换替代,迭代器并不是一种数据结构或者集合,而是可以过迭代器中的方法逐个访问集合中的每个元素的一种方法。提到迭代器最重要的就是Iterator接口,所有想要使用迭代器迭代的结构都需要实现或者继承这个接口

迭代器的4个API

  Iterator接口包含4个方法,分别是next、hasNext、remove、forEachRemaining,接下来在学习构造器如何使用之前我们先学习一下它的四种方法

  首先一开始构造器中的有一个类似于指针的标志,指在集合中第一个元素的前面,调用构器中的next方法会使这个"指针"的位置后移到第一和二个元素之间,然后返回它跨过的那个元素给构造器,也就是第一个元素,如果"指针"到最后一个元素后面再调用next方法的话就会导致抛出NoSuchElementException

  remove方法则是删除当前元素,可以理解为next方法返回的那个元素,如果调用remove方法之前没有调用next方法或者是使用remove方法删除该元素之后都会导致构造器为空,此时调用remove方法就会导致程序抛出IllegalStateExceptions异常

  hasNext方法就是判断迭代器是否还有可迭代的下一个元素,如果有的话就返回true否则返回false,为了避免上述两种异常,remove方法每次都要配合另外两种方法一起使用,每次调用next方法之前都使用hasNext方法判断一下,避免没有可迭代元素导致的异常,每一次调用remove之前都使用next方法获得元素,避免迭代器为空导致的状态异常

  forEachRemaining方法则可以直接遍历迭代器中的每一个元素并调用方法参数中的Lambda表达式,直到迭代器将集合的元素全部迭代完为止

如何使用迭代器?

  接下来将结合上面的描述给出一个将集合中的元素全部删除的标准代码,然后再给出两个错误的代码,大家可以在使用迭代器的时候规避一下

正确写法

// 创建一个ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
// 获得迭代器对象
Iterator<String> iterator = strings.iterator();
// 使用while循环迭代集合中元素 使用hasNext方法判断
while (iterator.hasNext()) {
    // 使用next获取下一个元素
    iterator.next();
    // 删除这个元素
    iterator.remove();
    // 打印集合中元素
    System.out.println(strings);
}

错误示范一

// 创建一个ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
// 获得迭代器
Iterator<String> iterator = strings.iterator();
// 使用while循环迭代集合中元素 使用next方法判断下一个元素是否为空
while (iterator.next() != null) {
    // 输出这个元素
    System.out.println(iterator.next());
}

  第一个的错误原因:使用next方法判断下一个元素是否为空,这样就会导致"指针"到最后一个元素后面依旧会执行next方法,这样就会导致抛出NoSuchElementException异常;而且next方法每调用一次都会将"指针"向后移动一位,哪怕只是用于if判断。所以程序就会每隔一个元素输出一次,最后抛出NoSuchElementException异常

错误示范二

// 创建一个ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");
// 获取迭代器对象 并使用while循环迭代集合中元素 使用hasNext方法判断
while (strings.iterator().hasNext()) {
    // 获取迭代器对象 并使用next获取下一个元素 然后输出
    System.out.println(strings.iterator().next());
}

  第二个的错误原因:每使用iterator方法获得一次集合对应的迭代器对象,都会默认将"指针"放到第一个元素的前面,于是第二个错误示范中一直使用集合中的第一个元素"a"进行判断有没有下一个元素,所以会导致程序陷入死循环,循环体里也会一直创建结合的迭代器对象,并将"指针"放到第一个元素的前面,然后调用next方法输出元素"a"

Collection集合接口知多少?

  集合大体上可以分为两种,一种是单列的Collection集合,一种就是双列的Map集合,所谓的单双列可以理解为元素中数据的个数,单列集合一个数据作为元素存储,双列集合两个具有映射关系的数据作为元素存储。这一篇我们先学习Collection集合接口的内容,Collection集合按照元素存储是否有序又可分为List集合、Set集合

  前面之所以先学习Iterator接口的原因就是,Collection接口继承了Iteator接口,于是它的子接口set和list都可以使用迭代器对集合中的元素进行迭代

为什么不使用数组而是集合?

  在学习集合之前,我们将存储多个对象或者元素的任务都交给了数组,但是数组存储元素有以下缺点:

①数组一旦初始化之后,长度就确定不可修改,元素个数超出数组长度的话会抛异常。

②数组中提供的API很少,增加元素需要现将索引后的元素后移空出位置将元素添加进去,删除元素需要删除之后将后面的元素前移将空出来的位置补足,以上操作只能通过代码实现并没有现成的API可以使用。

③数组存储数据的特点:有序、可重复,对于一些无需、不可重复的业务需求就很难满足

  集合就可以很好的弥补数组的上述缺点,而且集合提供了一组较为完善的数据结构,我们可以根据具体的业务需求来选择具体使用的集合类型。比如说存储元素无序不可重复的Set集合,有序可重复的List集合,具有映射关系的Map集合等

Collection接口的API都有什么?

AbstractCollection类知多少?

  以上给出的Collection接口中的API都是抽象方法,也就意味着每一个此接口的实现类都需要重写这些抽象方法,实际上Collection接口的直接或者间接实现类有很多,如果每一个都需要重写这些方法的话就会很是麻烦。于是Java类库的设计者提供了AbstractCollection类,该类中只将size方法和Iterator方法声明为抽象,其他方法都提供了默认实现,如果子类不提供这些方法的方法体的话就使用该类中的默认实现

  下图可知,list、set集合的实现类都直接或者间接的继承了AbstractCollection类,为的就是简化重写Collection接口的抽象方法

到此这篇关于Java迭代器与Collection接口超详细讲解的文章就介绍到这了,更多相关Java迭代器与Collection接口内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java迭代器与Collection接口超详细讲解

本文链接: https://www.lsjlt.com/news/164597.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java迭代器与Collection接口超详细讲解
    目录关于迭代器你都知道什么什么是迭代器迭代器的4个API如何使用迭代器?Collection集合接口知多少为什么不使用数组而是集合Collection接口的API都有什么Abstra...
    99+
    2022-11-13
  • Java超详细透彻讲解接口
    目录一、引入二、理解三、使用四、应用-代理模式(Proxy)1. 应用场景2. 分类3. 代码演示五、接口和抽象类之间的对比六、经典题目(排错)一、引入 一方面,有时必须从几个类中派...
    99+
    2022-11-13
  • Java超详细讲解接口的实现与用法
    目录1.接口的定义2.接口的实现3.接口的引用4.接口的继承5.利用接口实现多重继承1.接口的定义 接口是一种特殊的抽象类,是Java提供的一个重要的功能,与抽象类不同的是: 接口的...
    99+
    2022-11-13
  • Java超详细讲解抽象类与接口的使用
    目录一、抽象类1、抽象类的语法2、抽象类的特性3、抽象类的作用二、接口1、接口的概念2、接口使用3、接口特性4、实现多个接口5、接口间的继承6、常用的接口(1)Comparable接...
    99+
    2022-11-13
  • Java数据结构算法Collection接口迭代器示例详解
    目录Java合集框架Collection接口迭代器Java合集框架 数据结构是以某种形式将数据组织在一起的合集(collection)。数据结构不仅存储数据,还支持访问和处理数据的操...
    99+
    2022-11-13
  • Javascript的迭代器和迭代接口详解
    目录1,什么是迭代器2,自定义迭代接口3,原生语言的迭代总结1,什么是迭代器 每一个可迭代对象都对应着一个可迭代接口[Symbol.iterator]; [Symbol.iterat...
    99+
    2022-11-13
  • Java 超详细讲解SpringMVC拦截器
    目录拦截器(interceptor)的作用拦截器和过滤器区别拦截器快速入门多拦截器操作拦截器方法说明本章小结拦截器(interceptor)的作用 Spring MVC 的 拦截器 ...
    99+
    2022-11-13
  • Java超详细讲解WebMvcConfigurer拦截器
    目录addInterceptors拦截器addViewControllers页面跳转addResourceHandlers静态资源configureViewResolvers视图解析...
    99+
    2022-11-13
  • Java栈与队列超详细分析讲解
    目录一、栈(Stack)1、什么是栈?2、栈的常见方法3、自己实现一个栈(底层用一个数组实现)二、队列(Queue)1、什么是队列?2、队列的常见方法3、队列的实现(单链表实现)4、...
    99+
    2022-11-13
  • C语言 超详细讲解链接器
    目录1 什么是链接器2 声明与定义3 命名冲突3.1 命名冲突3.2 static修饰符4 形参、实参、返回值5 检查外部类型6 头文件1 什么是链接器 典型的链接器把由编译器或汇编...
    99+
    2022-11-13
  • Java中JDK动态代理的超详细讲解
    目录1. 什么是动态代理?2.动态代理的实现方式有几种?3. JDK动态代理4. CGLB动态代理5.动态代理的效率6.为什么要使用动态代理呢?7. JDK动态代理详细使用介绍总结1...
    99+
    2022-11-13
    Java jdk动态代理 java动态代理原理 jdk动态代理是如何实现的
  • Java超详细讲解ArrayList与顺序表的用法
    目录简要介绍Arraylist容器类的使用Arraylist容器类的构造ArrayList的常见方法ArrayList的遍历ArrayList中的扩容机制简要介绍 顺序表是一段物理地...
    99+
    2022-11-13
  • Java超详细讲解多线程中的Process与Thread
    目录进程和线程的关系操作系统是如何管理进程的并行和并发创建线程的方法串行执行和并发执行Thread中的一次额重要方法中断线程线程等待线程休眠(sleep)进程和线程的关系 ⭐在操作系...
    99+
    2022-11-13
  • Java超详细讲解抽象类的原理与用法
    目录1. 抽象类是什么2 抽象类的语法3 抽象类都有什么特性4 抽象类是干什么的1. 抽象类是什么 ️给大家上一篇小作文,看完这个,你就理解了什么叫做抽象类 在面向对象的概念中,所有...
    99+
    2022-11-13
  • Java超详细介绍抽象类与接口的使用
    目录1.抽象类的语法和特性1.1语法1.2特性2.接口的语法和使用2.1语法2.2特性1.抽象类的语法和特性 1.1语法 1.在Java中,一个类如果被abstract 修饰称为抽象...
    99+
    2022-11-13
  • Java超详细讲解IO操作字节流与字符流
    目录IO操作字节流FileInputStreamFileOutputStream字节流读写案例字符流FileReaderFileWriter字节流与字符流的区别IO操作 字节流 ...
    99+
    2022-11-13
  • Java详细讲解不同版本的接口语法和抽象类与接口的区别
    目录什么是接口?接口的语法: (JDK7.0)接口的语法: (JDK8.0)接口的语法: (JDK9.0)—(私有方法)接口的分类常量接口:空接口:函数式接口:什么是接口...
    99+
    2022-11-13
  • Java依赖注入容器超详细全面讲解
    目录一、依赖注入Dependency Injection二、解析2.1 典型的配置文件2.2 配置文件所对应的Java类2.3 定义解析器三、bean工厂(根据bean定义创建bea...
    99+
    2023-01-12
    Java依赖注入容器 Java依赖注入
  • SpringIOC推导与DI构造器注入超详细讲解
    目录了解准备IOC思想IOC本质XML配置SpringIOC创建对象方式了解准备 什么是Spring? Spring是一款轻量级的控制反转(IOC)和面向切面编程(AOP)的非入侵式...
    99+
    2023-02-20
    Spring IOC推导 Spring DI构造器注入 Spring IOC推导与DI构造器注入
  • Java多态性抽象类与接口细致详解
    目录1、多态性1.1向上转型1.2向下转型2、抽象类2.1抽象类的基本概念3、接口3.1接口的基本概念3.2接口的使用限制3.3使用接口定义标准3.4抽象类与接口的区别1、多态性 多...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作