java 子窗口返回一个list绑定s:iterator_Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)...

本文深入解析Java中的迭代器,包括Iterator和ListIterator两种主要类型,介绍它们的基本概念、方法及其实现原理。同时探讨了迭代器与容器类之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本概念

迭代器是一个对象,也是一种设计模式,Java有两个用来实实现迭代器的接口,分别是Iterator接口和继承自Iterator的ListIterator接口。实现迭代器接口的类的对象有遍历集合对象,选择集合中的元素和删除集合中元素的方法。而在使用它时不必知道该集合对象底层的结构。Java类库中实现Iterator接口的迭代器只能正向遍历集合中的元素,而实现ListIterator接口的迭代器不仅能够正向遍历,还能够反向遍历集合中的元素。

二、源码分析

2.1、Iterator接口与ListIterator接口的继承与实现

5fa82b22d1ac78f29b3a2259c9ed47cf.png

图2.1  Java迭代器类的继承与接口实现(部分)

ListIterator接口继承了Iterator接口。在AbstractList、ArrayList和Vector这三个类中的内部类ListItr实现了ListIterator接口,这三个类的内部类ListItr又分别继承了在这三个类中实现了Iterator接口的内部类Itr。实现ListIterator的类还有LinkedList的内部类ListItr。实现Iterator的类还有LinkedList的内部类DescendingIterator,HashMap的内部类EntryIterator,KeyIterator,ValueIterator,以及TreeMap的内部类PrivateEntryIterator等。

2.2、迭代器接口方法

1)迭代器的向前移动与向后移动图解

d404640a9e5a816c3478e73cc431e529.png

2)Iterator接口方法

packagejava.util;importjava.util.function.Consumer;public interface Iterator{booleanhasNext();/*在Java中,这个方法的具体实现一般用来在遍历容器时,调用该方法使迭代器向前移动一位,来检测集合中是否还有下一个元素,还有下一个元素返回true,否则返回false*/E next();/*实现这个方法,在遍历容器时,调用该方法将迭代器向前移动一位,并将迭代器越过的一个元素作为方法的返回值。该方法用来返回集合中下一个元素。

在调用next()方法前,先调用hasNext()方法判断集合中是否还有下一个元素*/

default voidremove() {throw new UnsupportedOperationException("remove"); }/*实现这个方法,用来删除在迭代器调用next()方法迭代器越过的一个元素*/

default void forEachRemaining(Consumer super E>action) { Objects.requireNonNull(action);while(hasNext()) action.accept(next()); }/*实现这个方法来顺序遍历容器中的每个元素,用来实现集合类的ForEach遍历操作*/}

3)ListIterator接口方法

packagejava.util;public interface ListIterator extends Iterator{boolean hasNext();//同Iterator接口,用来检测迭代器前面是否还有元素

E next();//同Iterator接口,使迭代器向前移动一位,获得迭代器越过的下一个元素

booleanhasPrevious();//实现这个方法来检测当前迭代器位置后面是否有元素,用于反向遍历

E previous();/*实现这个方法,将迭代器向后移动一位,并将迭代器越过的后面的一个元素作为方法返回值,在调用该方法前需要调用hasPrevious方法来判断迭代器前是否有元素*/

int nextIndex();//实现该方法获取迭代器前面一个元素的索引

int previousIndex();//实现该方法获取迭代器后面一个元素的索引

voidremove();/*实现该方法,用来删除迭代器调用next()方法或调用previous()方法时迭代器越过的一个元素*/

void set(E e);//实现该方法在迭代器遍历时修改元素

void add(E e);//实现该方法在迭代器遍历时添加元素

}

2.3、容器类与迭代器的关系

1)Iterator接口。阅读源码可知,Collectiion接口实现了Iterable接口,Iterable有一个返回一个Iterator对象的iterator()方法,所以继承和实现了Collection接口的所有容器类及其子类和实现类都有一个返回Iterator对象的的iterator()方法。Java中有很多容器类中都设计有实现了Iterator接口的内部类,如ArrayList和LinkedList等类。HashMap和TreeMap类中也包含有实现了Iterator的内部类,来对Map中的KeySet、Value和EntrySet进行迭代。Iterable接口的源代码如下:

public interface Iterable {

Iteratoriterator();//实现这个方法,该方法返回一个Iterator迭代器对象。default void forEach(Consumer super T>action) {

Objects.requireNonNull(action);for (T t : this) {

action.accept(t);

}

}//实现这个方法来对容器进行ForEach遍历default Spliteratorspliterator() {return Spliterators.spliteratorUnknownSize(iterator(), 0);

}

}

2)ListIterator接口。查看源码可以发现,List接口中有两个返回ListIterator对象的方法,如下。List接口下的的ArrayList和LinkedList都有返回ListIterator对象的方法。

ListIteratorlistIterator();//实现这个方法,该方法返回一个ListIterator迭代器对象,迭代器初始化后,一般迭代器位于在容器第一个元素后面。

ListIterator listIterator(int index);//实现这个方法,返回一个指定了开始遍历容器时迭代器初始位置的ListIterator迭代器对象

ArrayList类设计有实现了ListIterator接口的内部类ListItr(不过ArrayList的listIterator(final int index)方法并未使用这个内部类,而是在方法中又设计了一个ListIterator匿名内部类作为方法返回值,可以发现ArrayList的Iterator()方法也是调用了这个方法来构建迭代器对象)。ArrayList类中部分有关源码如下

private class ListItr extends Itr implements ListIterator{

ListItr(intindex) {super();

cursor=index;

}

public Iteratoriterator() {returnlistIterator();

}public ListIterator listIterator(final intindex) {

checkForComodification();

rangeCheckForAdd(index);final int offset = this.offset;return new ListIterator() {//返回了一个ListIterator匿名内部类int cursor =index;int lastRet = -1;int expectedModCount = ArrayList.this.modCount;public booleanhasNext() {return cursor != SubList.this.size;

}

LinkedList类也有一个内部类ListItr实现了ListIterator接口,LinkedList的listIterator()方法返回了这个内部类的实例。LinkedList中部分有关源码如下

public ListIterator listIterator(intindex) {

checkPositionIndex(index);return newListItr(index);

}private class ListItr implements ListIterator {

(小官原创,若有谬误,望各位前辈批评指正)

内容概要:本文详细介绍了基于结构不变补偿的电液伺服系统低阶线性主动干扰抑制控制(ADRC)方法的实现过程。首先定义了电液伺服系统的基本参数,并实现了结构不变补偿(SIC)函数,通过补偿非线性项和干扰,将原始系统转化为一阶积分链结构。接着,设计了低阶线性ADRC控制器,包含扩展状态观测器(ESO)和控制律,用于估计系统状态和总干扰,并实现简单有效的控制。文章还展示了系统仿真对比实验,对比了低阶ADRC传统PID控制器的性能,证明了ADRC在处理系统非线性和外部干扰方面的优越性。此外,文章深入分析了参数调整稳定性,提出了频域稳定性分析和b0参数调整方法,确保系统在参数不确定性下的鲁棒稳定性。最后,文章通过综合实验验证了该方法的有效性,并提供了参数敏感性分析和工程实用性指导。 适合人群:具备一定自动化控制基础,特别是对电液伺服系统和主动干扰抑制控制感兴趣的科研人员和工程师。 使用场景及目标:①理解电液伺服系统的建模控制方法;②掌握低阶线性ADRC的设计原理和实现步骤;③学习如何通过结构不变补偿简化复杂系统的控制设计;④进行系统仿真实验验证,评估不同控制方法的性能;⑤掌握参数调整稳定性分析技巧,确保控制系统在实际应用中的可靠性和鲁棒性。 阅读建议:本文内容详尽,涉及多个控制理论和技术细节。读者应首先理解电液伺服系统的基本原理和ADRC的核心思想,然后逐步深入学习SIC补偿、ESO设计、控制律实现等内容。同时,结合提供的代码示例进行实践操作,通过调整参数和运行仿真,加深对理论的理解。对于希望进一步探索的读者,可以关注文中提到的高级话题,如频域稳定性分析、参数敏感性分析等,以提升对系统的全面掌控能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值