首页 > 编程语言 >Java-ArrayList.Itr类(Iterator的实现)

Java-ArrayList.Itr类(Iterator的实现)

时间:2023-02-13 16:24:25浏览次数:53  
标签:Java 迭代 iterator ArrayList 元素 next cursor Itr lastRet

 本文转载自:Java-ArrayList.Itr类(Iterator的实现)

 

本文介绍java迭代器的实现之一,ArrayList类的迭代器实现
本文示例代码如下

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    list.add("D");
    Iterator<String> iterator = list.iterator();
    String n1 = iterator.next();// 第1个next
    String n2 = iterator.next();// 第2个next
    iterator.remove();
    String n3 = iterator.next();// 第3个next
    String n4 = iterator.next();// 第4个next
    String n5 = iterator.next();// 第5个next
  }

 

当执行完下面这一行的时候,迭代器结构如图所示

Iterator<String> iterator = list.iterator();

 

首先,要明确3个概念

索引处的-1:这是我臆想出来的,当然,索引中没有-1这个概念的,我为了便于理解,将0前面的索引,认为是-1,这个-1是做什么用的呢?与下面的lastRet有关,如果lastRet指向-1,则认为当前迭代器没有指向任何元素

lastRet:(注意,源码注释中写的是index of last element returned; -1 if no such,我个人认为源码注释中写的不是很恰当,当然,我没有任何资格质疑源码注释,但是我觉得如果按照注释的方式去理解,我没法理解。。。),
我自己认为lastRet表示迭代器中,当前指向的元素,也就是说如果你调用remove方法,会删除当前这个元素,那么刚开始调用iterator方法,lastRet因为没有指向任何元素,所以lastRet会在-1索引处,此时如果你调用remove方法,会报错,因为当前没有任何元素(-1处没有任何元素)
cursor:表示当前元素的下一个元素(按照注释所说),注意,按照简单的理解,下一个元素应该就是当前元素+1即可,那么为什么会单独用一个cursor来表示呢?我个人认为cursor这个词不应该叫cursor,而应该叫temp,表示临时变量,它就是用来计算lastRet的,如果理解成cursor,那么它就应该直接前元素+1即可

当代码执行第1个next()方法的时候,先将cursor的值给lastRet,表示当前元素变成了A,然后再将cursor+1(虽然源码的写法不是这样,但是它的逻辑就是这样)此时,lastRet指向索引0,正好是值“A”,所以此时next方法返回“A”,当前操作迭代器结构如下图

 

当代码执行第2个next()方法的时候,再将cursor+1,然后再将lastRet+1,此时,lastRet指向索引1,正好是值“B”,所以此时next方法返回“B”,当前操作迭代器结构如下图

 

代码继续走,执行remove方法的时候,由于当前元素指向索引1,也就是值“B”,所以remove方法会将B删除,因为B被删除了,lastRet指向的B已不存在了,所以此时,lastRet又回到了-1索引出,表示lastRet当前没有指向任何值,此时,迭代器的结构如下图

 

由于ArrayList是基于数组,所以ArrayList会附加数组的特性,也就是说,当B被删除后,C和D会向上移动,而此时cursor与C保持一致,随着C的上移,cursor也会与C同步,向上移动,此时,迭代器的数据结构如下图

 

下面执行第3个next方法,根据上述原理,我们知道,执行next方法,首先会把cursor的值给lastRet,然后cursor+1,第三个next方法执行完毕之后,会返回字符串“C”,迭代器中的数据结构如下图

 

下面执行第4个next方法,同上,我们可以知道执行完毕之后,会返回字符串“D”,迭代器中的数据结构如下图

 

下面执行第5个next方法,根据上述原理,我们可以推出,如果第五个方法没有任何意外发生,那么lastRet将指向索引3,而此时,索引3没有任何数据,所以当执行第五个next方法的时候,会抛出异常

 

总结:

lastRet:表示当前操作的元素
cursor: 表示下个要操作的元素(突然觉得这句话也对)
next方法:把cursor的值给lastRet,此时当前要操作的元素就是lastRet,cursor+1
remove方法:删除当前lastRet所指向的元素,删除之后,因为lastRet所指向的元素消失,所以lastRet又指向了-1,由于数组特性,cursor随着它所对应的数据,同步上移

 

标签:Java,迭代,iterator,ArrayList,元素,next,cursor,Itr,lastRet
From: https://www.cnblogs.com/r1-12king/p/17116784.html

相关文章

  • 30个Javascript知识点总结,总有你不会的!
    近重温了一遍红宝书,发现一些比较好玩的写法,很多东西日常都在用,但是发现还会有不一样的写法,结合一些日常工作中使用的方法,为大家总结一篇日常经常使用可能还不知道的点,希望......
  • LeetCode-83. 删除排序链表中的重复元素(java)
    一、前言:......
  • java中的日期类
    java中的日期类​​一、日期类​​​​1.1第一代日期类​​​​1.1.1Date类​​​​1.1.2SimpleDateFormat类​​​​1.2第二代日期类Calendar​​​​1.3第三代日期类......
  • java中的多线程
    多线程​​1、线程概述​​​​1.1进程​​​​1.2线程​​​​2、线程的创建和启动​​​​2.1继承Thread类​​​​2.2实现Runnable接口​​​​2.3继承Thread类和实......
  • JavaScript的原型、原型链、异步与单线程复习回顾
     原型和原型链有对象的地方就有原型,每个对象都会在其内部初始化一个属性,就是prototype(原型),原型中存储共享的属性和方法。当我们访问一个对象的属性时,js引擎会先看当......
  • JAVA-JDK的下载配置
    JAVA-day01JDK1.8的安装和配置地址jdk安装地址安装顺序 选择好适合自己电脑的JDK,下载:默认选项修改目录安装jre完成安装环境搭建......
  • 用IDEA生成javadoc文档
    文章目录​​一、前言​​​​二、IDEA生成API的步骤​​​​1、Tools->GeneartejavaDoc​​​​2、设置​​​​1、参数解释:​​​​2、生成文档​​​​3、文档结构如下......
  • java使用JDBC与mysql进行连接基础操作
    packagecom.atguigu.api.statement;importcom.mysql.cj.jdbc.Driver;importjava.sql.*;//使用statement查询t_user表下所有用户数据//在连接前要导入数据库连接的jar包p......
  • java transient关键字
    1、含义transient是短暂的意思。用transient关键字修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略,生命对象仅存在于调用者的内存中而不会被写到硬盘里。 示......
  • 提高代码质量的 11 个高级 JavaScript 函数
    通过使用包括Debounce、Once和Memoize的函数,以及Pipe、Pick和Zip,来提高代码质量!介绍JavaScript是一种强大而多功能的编程语言,具有许多内置特性,可以帮助您编写......