本文介绍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个nextString n2 = iterator.next();// 第2个nextiterator.remove();String n3 = iterator.next();// 第3个nextString n4 = iterator.next();// 第4个nextString 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-ArrayList.Itr类(Iterator的实现)相关推荐

  1. Iterator中的Itr类(ArrayList)

    填坑了,填坑了. 上一篇留的问题,大家都有看吗,哪怕没看,那有放在IDEA中执行吗? 好,我就认为大家都有思考,下面就是到了激动人心,公布答案的时间啦. 按照日常的套路来,答案当然是错误的,恭喜你,都 ...

  2. java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 1.ConcurrentModific ...

  3. FAQ(80):java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification

    2018年8月31日 1.日志: 2018-04-13 20:00:55.757:WARN:oejs.ServletHandler:/g01-web/admin/activityManager/sen ...

  4. java.util.ConcurrentModificationException at java.util.ArrayList$Itr.next(ArrayList.java:860

    问题 使用ArrayList数据结构, 在迭代的请求页面进行数据刷新, 控制台报错 java.util.ConcurrentModificationExceptionat java.util.Arra ...

  5. Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法

    Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法 一.概述 在java集合中,常用ArrayList类中,若需要 ...

  6. Java ArrayList 类

    ArrayList 类继承了 AbstractList 并实现了 List 接口. ArrayList 支持可以根据需要增长的动态数组. 标准 Java 数组是固定长度的. 数组创建后不能增长或缩小, ...

  7. Java ArrayList 类(详解)

    ArrayList 一.ArrayList 是什么? 二.Java ArrayList 方法 三.案例演示 结果: 一.ArrayList 是什么? ArrayList 类是一个可以动态修改的数组,与 ...

  8. java的Scanner类、Random类、ArrayList类

    第1章 API 1.1 概述 API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的字典 ,是JDK中提供给我们使用的类的说明文 ...

  9. Java中 Iterable 和 Iterator 的区别

    1.Iterable接口 Iterable接口 (java.lang.Iterable) 是Java集合的顶级接口之一.我们首先看下这这个接口在JDK中的定义: package java.lang; ...

  10. Java基础篇:Iterator迭代器

    一.什么是Iterator: 迭代器(Iterator)是一个对象,它的工作是遍历并目标序列中的对象,它提供了一种访问一个容器(container)对象中的各个元素的方法,把访问逻辑从不同类型的集合类 ...

最新文章

  1. Vlan 4096的限制原因
  2. 远程升级stm32程序_STM32IAP远程升级带C#上位机
  3. 单机启动nacos_dockercompose部署nacos单机版(简洁优化版)
  4. css怎么使元素绝对定位有过度效果_小猿圈web前端讲解div+css绝对定位和相对定位...
  5. date对象加十分钟_js面向对象-这样学很轻松
  6. 记一次在Tomcat部署项目后无法启动该项目的例子
  7. React 使用图片验证码组件(登录验证)
  8. Windows字体文件存放位置
  9. 基于模糊PID控制器的水温控制系统仿真
  10. Spring Cloud微服务架构图
  11. vivo Y51的USB调试模式在哪里,开启vivo Y51USB调试模式的教程
  12. 2020年阴历二月二十九 投资理财~业余投资者如果不深入研究财报该怎么办?
  13. 347. Top K Frequent Elements
  14. 在cmd中使用start运行exe文件闪退问题
  15. 电容笔有必要买吗?双十一性价比高的电容笔推荐
  16. 一文了解三种3D视觉技术
  17. 浪潮cs5280H raid方案详细
  18. Nutch 2.0 终于来了
  19. Apollo control模块纵向控制原理及核心代码逐行解析
  20. 那些Chrome不为人知的高效隐藏技巧,让你的浏览器好用10倍!

热门文章

  1. android 开机打开串口失败,请大神帮我看看这是怎么回事,一用就说串口打开失败,再电脑上试...
  2. 无法执行任何java命令,报错OutOfMemoryError: Cannot create GC thread. Out of system resources
  3. sqlserver2000与sqlserver2005驱动与url的区别
  4. java托盘图标变白在linux,升级Ubuntu后系统托盘图标消失
  5. 2021年广东新高考学业水平考试成绩查询,2021年1月广东高中学业水平考试成绩查询时间及入口...
  6. 联想e480一键恢复小孔_thinkpade480win10如何一键还原
  7. 支付接口调用成功后如何让前端知道_开发口中的「接口」到底是什么
  8. 前端传递数据超过2M不能传给后台
  9. Android开发笔记(一百四十六)仿支付宝的支付密码输入框
  10. 项目中公用的一些php函数,大多数curl相关的