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

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

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

什么是迭代器?

  所谓迭代的意思就是交换替代,迭代器并不是一种数据结构或者集合,而是可以过迭代器中的方法逐个访问集合中的每个元素的一种方法。提到迭代器最重要的就是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接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java设计模式之java迭代器模式详解

    目录 前言 介绍 角色 迭代器模式中的工厂模式 学院遍历的案例 分析 解决方案 基本介绍 原理类图 上面案例的类图 案例实现代码 案例总结 应用实例 Java集合中的迭代器模式 角色说明 Mybatis中的迭代器模式 优点 缺点 总结 前言 很早之前,我们的电视调节频道是需要用电视上的按钮去控制的,那时并没有遥控器,如果我们想要调台,只能一次又一次的拧按钮. 越来越高级的电视机相继出现,现在的电话机,我们有了电视遥控器,我们使用电视遥控器来调台,这个时候,无需直接操作电视. 我们可以将电视机看成

  • Java的Collection集合的常用方法详解

    目录 1.boolean add(Ee) 2.boolean addAll(Collection<? extends E>c) 3.void clear() 4.boolean contains(Objecto) 5.boolean containsAll(Collection<?>c) 6.boolean equals(Objecto) 7.int hashCode() 8.boolean isEmpty() 9.Iterator<E> iterator() 10.b

  • 深入理解Java设计模式之迭代器模式

    目录 一.什么是迭代器模式 二.迭代器模式的结构 三.迭代器模式的使用场景 四.迭代器模式的优缺点 优点: 缺点: 五.迭代器模式的实现 抽象聚合类 迭代器抽象类 具体聚合类 具体迭代器类 客户端调用 六.NET中迭代器模式的应用 七.总结 一.什么是迭代器模式 迭代器模式是针对集合对象而生的,对于集合对象而言,肯定会涉及到对集合的添加和删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作放在集合对象中,但这样的话,集合对象既承担太多的责任了,面向对象设计原则中有一条就是单一职责原

  • java迭代器基础知识点总结

    在学习集合的时候,我们经常会说把集合里的元素进行遍历,实际上这个过程有一个专门的名称,叫做迭代.迭代器就是对这种遍历进行操作的工具,好处是能够使内部程序的细节得到保密.下面我们就java迭代器的概念.作用进行具体的分析,会结合一些元素.接口的知识点,最后带来使用迭代器的实例. 1.概念 是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节. 2.作用 java中提供了很多种集合,它们在存储元素时,采用的存储方式不同.所以当我们要取出这些集合中的元素时,可以通过一种通用

  • java迭代器原理及迭代map的四种方式

    目录 迭代器原理: 什么是迭代器,使用迭代器的好处? 迭代器怎么实现的? 迭代器的陷阱? 为什么会产生这样的错误? 遍历map的四种方式 迭代器原理: 什么是迭代器,使用迭代器的好处? 迭代器就是用来遍历集合中对象的东西,也就是说,对于集合,我们不像对原始数组那样通过直接访问元素来迭代的,而是通过迭代器来遍历对象.这么做的好处是将对于集合类型的遍历行为与被遍历集合对象分离,这样以来,就不需要关心该集合类型的具体实现是怎么样的.只要获取这个集合对象的迭代器便可以遍历这个集合中的对象.而像遍历对象顺

  • Java集合的Collection接口和List接口详解

    目录 1集合的概念 2集合的父类Collection接口 2.1常用方法 2.2遍历 3List接口 3.1List接口常用方法 3.2遍历 4集合中元素的去重 总结 1集合的概念 把集合看做是一个容器,集合不是一个类,是一套集合框架,框架体系包含很多的集合类,java api提供了 集合存储任意类型(基本包装类型,引用类型) 集合对元素的增删查改操作起来非常方便的,专门提供很多方便操作的方法 开发中经常集合来操作数据的,开发地位比较高的,考虑对数据的操作效率上的问题 2 集合的父类Collec

  • Java 如何绕过迭代器遍历时的数据修改异常

    前言 既然是绕过迭代器遍历时的数据修改异常,那么有必要先看一下是什么样的异常.如果在集合的迭代器遍历时尝试更新集合中的数据,比如像下面这样,我想输出 Hello,World,Java,迭代时却发现多了一个 C++ 元素,如果直接删除掉的话. List<String> list = new ArrayList<>(); Collections.addAll(list, "Hello", "World", "C++", &qu

  • Java Collection 接口和常用方法综合详解

    目录 1. Collection 接口实现类的特点 2. Collection 接口常用方法 3. Collection接口遍历元素方式1- 使用Iterator(迭代器) 4. Collection 接口遍历对象方式2- for 循环增强 5. 练习 1. Collection 接口实现类的特点 public interface Collection<E> extends Iterable<E> 1)Collection实现子类可以存放多个元素,每个元素可以是Object 2)有

  • Java中Collection集合的常用方法详解

    目录 1.boolean add(E e) 2.boolean addAll(Collection<? extends E> c) 3.void clear() 4.boolean contains(Object o) 5.boolean containsAll(Collection<?> c) 6.boolean equals(Object o) 7.int hashCode() 8.boolean isEmpty() 9.Iterator<E> iterator()

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

    目录 关于迭代器你都知道什么? 什么是迭代器? 迭代器的4个API 如何使用迭代器? Collection集合接口知多少? 为什么不使用数组而是集合? Collection接口的API都有什么? AbstractCollection类知多少? 关于迭代器你都知道什么? 什么是迭代器?   所谓迭代的意思就是交换替代,迭代器并不是一种数据结构或者集合,而是可以过迭代器中的方法逐个访问集合中的每个元素的一种方法.提到迭代器最重要的就是Iterator接口,所有想要使用迭代器迭代的结构都需要实现或者继

  • Java 超详细讲解抽象类与接口的使用

    目录 一.抽象类 1.抽象类的语法 2.抽象类的特性 3.抽象类的作用 二.接口 1.接口的概念 2.接口使用 3.接口特性 4.实现多个接口 5.接口间的继承 6.常用的接口 (1)Comparable接口 (2)Cloneable接口 三.Object类 一.抽象类 在Java中,如果一个类被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出方法体. 1.抽象类的语法 //抽象类:被abstract修饰的类 public abstract cl

  • Java超详细讲解接口的实现与用法

    目录 1.接口的定义 2.接口的实现 3.接口的引用 4.接口的继承 5.利用接口实现多重继承 1.接口的定义 接口是一种特殊的抽象类,是Java提供的一个重要的功能,与抽象类不同的是: 接口的所有数据成员都是静态的且必须初始化. 接口中的所有方法必须都是抽象方法,不能有一般的方法. [public] interface 接口名称 [extends  父接口名列表]{    [public] [static] [final]数据类型 成员变量名 = 常量;    ...    [public][

  • Java 超详细讲解数据结构中的堆的应用

    目录 一.堆的创建 1.向下调整(以小堆为例) 2.创建堆 3.创建堆的时间复杂度 二.堆的插入和删除 1.堆的插入 2.堆的删除 三.堆的应用 1.堆排序 2.top-k问题 [求最小的K个数] 四.常用接口的介绍 1.PriorityQueue的特性 2.优先级队列的构造 一.堆的创建 1.向下调整(以小堆为例) 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子) 如果parent的左孩子存在,即:child < size,

  • Java 超详细讲解数据结构中的堆的应用

    目录 一.堆的创建 1.向下调整(以小堆为例) 2.创建堆 3.创建堆的时间复杂度 二.堆的插入和删除 1.堆的插入 2.堆的删除 三.堆的应用 1.堆排序 2.top-k问题(求最小的K个数) 四.常用接口的介绍 1.PriorityQueue的特性 2.优先级队列的构造 一.堆的创建 1.向下调整(以小堆为例) 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子) 如果parent的左孩子存在,即:child < size, 进

  • Java超详细讲解ArrayList与顺序表的用法

    目录 简要介绍 Arraylist容器类的使用 Arraylist容器类的构造 ArrayList的常见方法 ArrayList的遍历 ArrayList中的扩容机制 简要介绍 顺序表是一段物理地址连续的储存空间,一般情况下用数组储存,并在数组上完成增删查改.而在java中我们有ArrayList这个容器类封装了顺序表的方法. 在集合框架中,ArrayList是一个普通的类,其实现了list接口.其源码类定义如图 可见,其实现了RandomAccess, Cloneable, 以及Seriali

  • Java中线程上下文类加载器超详细讲解使用

    目录 一.什么是线程上下文类加载器 1.1.重要性 1.2.使用场景 二.ServiceLoader简单介绍 三.案例 3.1.使用ServiceLoader加载mysql驱动 3.2.Class.forName加载Mysql驱动 3.2.1.com.mysql.jdbc.Driver 3.2.2.java.sql.DriverManager初始化 3.2.3.调用DriverManager的registerDriver方法 3.2.4.执行DriverManager.getConnection

  • java反射超详细讲解

    目录 Java反射超详解✌ 1.反射基础 1.1Class类 1.2类加载 2.反射的使用 2.1Class对象的获取 2.2Constructor类及其用法 2.4Method类及其用法 Java反射超详解✌ 1.反射基础 Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法:对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制. Java反射机制主要提供以下这几个功能: 在运行时判断任意一个对象所属

  • 超详细讲解Java线程池

    目录 池化技术 池化思想介绍 池化技术的应用 如何设计一个线程池 Java线程池解析 ThreadPoolExecutor使用介绍 内置线程池使用 ThreadPoolExecutor解析 整体设计 线程池生命周期 任务管理解析 woker对象 Java线程池实践建议 不建议使用Exectuors 线程池大小设置 线程池监控 带着问题阅读 1.什么是池化,池化能带来什么好处 2.如何设计一个资源池 3.Java的线程池如何使用,Java提供了哪些内置线程池 4.线程池使用有哪些注意事项 池化技术

  • 超详细讲解Java异常

    目录 一.Java异常架构与异常关键字 Java异常简介 Java异常架构 1.Throwable 2.Error(错误) 3.Exception(异常) 4.受检异常与非受检异常 Java异常关键字 二.Java异常处理 声明异常 抛出异常 捕获异常 如何选择异常类型 常见异常处理方式 1.直接抛出异常 2.封装异常再抛出 3.捕获异常 4.自定义异常 5.try-catch-finally 6.try-with-resource 三.Java异常常见面试题 1.Error 和 Excepti

随机推荐