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随着它所对应的数据,同步上移
本文地址:https://blog.csdn.net/u011624903/article/details/107365284
上一篇: 用lambda简化工厂设计模式
下一篇: Springboot笔记(1-30)