欢迎光临散文网 会员登陆 & 注册

千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java

2023-07-24 09:06 作者:羡江川QL  | 我要投稿

Iterator是迭代器,在代码中以接口的形式存在,当我们使用到迭代器时,首先要考虑为什么迭代器要使用接口的形式?因为接口是定义某种标准的,在Collection集合中我们都可以使用到Iterator去遍历元素,又因为Collection集合中的ArrayList、LinkedList等集合的数据结构或者逻辑结构都不相同。所以说没有直接在Iterator中去实现这些集合的遍历方法,可扩展性太差。我们在每个集合类中使用内部类来实现对集合元素的遍历。

各个集合的底层又是怎样去实现Iterator接口的,在这里以ArrayList作为例子:

我们在集合中增加或者删除元素的时候,为什么使用ArrayList对象直接调用增加或者删除方法,运行会直接报错?

首先要了解到Iterator的底层的核心是外部操作数和内部操作数是否一致,当我们在遍历元素的时候如果对当前遍历数组同时进行元素增加删除,会导致脏数据的出现。但是我们要在遍历数组的同时修改元素的话,我们需要使用到Iterator对象来进行删除或者增加。

接下来我来分析在Iterator中怎样去删除,以下用删除做例子:

我们在创建Iterator对象的时候,会创建一个Itr类,该类就是ArrayList中的内部类,在内部类中有游标、遍历当前元素的下标、内部操作数。首先要将在ArrayList中接收到的外部操作数赋值给内部操作数,来保证不会出现脏数据,在内部类中最重要的方法有hasNext()、next()等主要的方法。hasNext()主要是用游标来判断下一个指向是否有元素。next()方法先会检查外部操作数和内部操作数是否一致,不一致就直接报错(使用ArrayList对象来改变元素个数的时候就会出现此错误),然后接着判断游标是否超过元素个数,超过也会报错。在通过ArrayList.this来获取ArrayList中数据容器,通过游标+1来实现游标下沉,最后返回容器中的元素。remove()方法,先判断遍历元素的下标是否合法,不合法就报错,通过ArrayList.this来调用外部类ArrayList类中的remove方法,就是使用数组的复制,将变化后的新数组赋值给以前的数组。在使用外部类的方法时外部操作数会变化,我们需要重新将外部操作数赋值给内部操作数,这样才能保证脏数据不能出现

手撕LinkedList底层源码:

LinkedList的底层数据结构是双向链表,因为是链表结构,所以在LinkedList中会存在一个Node节点类,有三个参数,指向上一个节点的引用地址、指向下一个节点的引用地址、元素。 因为LinkedList还是属于Collection家族所以在遍历的时候还是使用Iterator或者使用ListIterator来遍历集合。

Iterator和ListIterator的区别是

1.两者遍历范围不一样;Iterator的遍历范围是在整个collection集合中,ListIterator是适用于List集合中

2.遍历的顺序也不相同;Iterator的顺序是正序遍历,ListIterator是可以正向遍历也可以倒序遍历

3.ListIterator实现的方法要多一些

4.ListIterator可以设置下标,所以可以从指定下标遍历,在调用listIterator方法时会创建ListItr对象,在这个对象中也会存在外部操作数,思想与Iterator一致,也有hasNext()和next(),会多了previous()、nextIndex()、previousIndex()等可以对双向链表进行操作的方法、因为多了下标元素所以就可以设置下标,也能添加数据。

ListIterator在Linkedlist集合内存中的存储过程:

在类加载的时候,先会加载到方法区中,加载主类Test01.class、LinkedList、LinkedList$Node.class,同时在常量池中加载常量。当在栈中调用主方法时,LinkedList集合会被创建,所以堆中会出现一个叫做myArrayList的LinkedList对象。由myArrayList在栈中执行add()方法将常量池中的数据加载到对象中,在添加的过程中底层使用LinkedList对象来调用linkLast方法,在第一次添加的时候,开始节点first和结束节点last都为null,首先将结束节点last的值赋值给新节点的开始节点l,然后创建新的节点,再将新节点的地址赋值给结束节点(last=newNode),会判断新节点的开始节点是否为空,为空证明该节点第一次创建。

千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java的评论 (共 条)

分享到微博请遵守国家法律