志在指尖
用双手敲打未来

Iterator

Java中,Iterator的作用就是为了便当处置汇合中的元素。例如获取和删除汇合中的元素。
在JDK8,Iterator接口提供了如下办法:
迭代器Iterator最根本的两个办法是next()和hasNext()。其中Java迭代器多了一个remove()办法。在JDK8中又新增了forEachRemaining()办法。
接下来,以ArrayList为例,看下迭代器在Java中的完成。
在ArrayList中,以内部类的方式完成,每次调用iterator()办法,都会newItr()。
先看一下ArrayList迭代器的完成类:
定义的参数如下:
1intcursor;//下标,默许值0;
2intlastRet=-1;//最后一个元素的下标,假如没有返回-1;
3intexpectedModCount=modCount;//构造修正(添加、删除等操作)次数,默许值0;java
定义的办法如下:
hasNext()办法:
1publicbooleanhasNext(){
2returncursor!=size;
3}
当汇合中不存在下一个元素,即曾经遍历至汇合末尾时,该办法返回false。hasNext办法主要用于循环终止条件。
next()办法:
复制代码
1publicEnext(){
2checkForComodification();
3inti=cursor;
4if(i>=size)
5thrownewNoSuchElementException();
6Object[]elementData=ArrayList.this.elementData;
7if(i>=elementData.length)
8thrownewConcurrentModificationException();
9cursor=i+1;
10return(E)elementData[lastRet=i];
11}
复制代码
在执行next()办法时,会先执行checkForComodification()办法,做一个判别(检查所迭代的列表对象能否被修正过):
1finalvoidcheckForComodification(){
2if(modCount!=expectedModCount)thrownewConcurrentModificationException();
3}
在对汇合停止迭代过程中,不允许呈现迭代器以外的对元素的操作,由于这样会产生平安隐患,java会抛出异常并发修正异常(ConcurrentModificationException),普通迭代器只支持在迭代过程中的删除动作。
假如在遍历ArrayList时,想添加元素和修正元素,能够调用List汇合的特有迭代器ListIterator。
remove()办法:
复制代码
1publicvoidremove(){
2if(lastRet<0)thrownewIllegalStateException();
3checkForComodification();
4
5try{
6ArrayList.this.remove(lastRet);
7cursor=lastRet;
8lastRet=-1;
9expectedModCount=modCount;
10}catch(IndexOutOfBoundsExceptionex){
11thrownewConcurrentModificationException();
12}
13}
复制代码
Java普通迭代器中独一支持修正构造的操作。在执行完删除操作后,会更新expectedModCount字段的值。
forEachRemaining()办法:
复制代码
1publicvoidforEachRemaining(Consumer<?superE>consumer){
2Objects.requireNonNull(consumer);
3finalintsize=ArrayList.this.size;
4inti=cursor;
5if(i>=size){
6return;
7}
8finalObject[]elementData=ArrayList.this.elementData;
9if(i>=elementData.length){
10thrownewConcurrentModificationException();
11}
12while(i!=size&&modCount==expectedModCount){
13consumer.accept((E)elementData[i++]);
14}
15//updateonceatendofiterationtoreduceheapwritetraffic
16cursor=i;
17lastRet=i-1;
18checkForComodification();
19}
复制代码
forEachRemaining()是JDK8中新增的办法。forEachRemaining()运用迭代器Iterator的一切元素,并且第二次调用它将不会做任何事情,由于不再有下一个元素。
一个运用场景:取得对应汇合的迭代器Iterator,然后您能够开端迭代,next()直抵达到某个条件,然后运用forEachRemaining()操作该Iterator上的其他局部。
接下来,看一下方才提到的ListIterator。
在普通的Iterator中,只能对元素停止获取(next())和删除(remove())的操作。而ListIterator提供了更多的办法:
add(Ee):将指定的元素插入列表,插入位置为迭代器当前位置之前
hasNext():以正向遍历列表时,假如列表迭代器后面还有元素,则返回true,否则返回false
hasPrevious():假如以逆向遍历列表,列表迭代器前面还有元素,则返回true,否则返回false
next():返回列表中ListIterator指向位置后面的元素
nextIndex():返回列表中ListIterator所需位置后面元素的索引
previous():返回列表中ListIterator指向位置前面的元素
previousIndex():返回列表中ListIterator所需位置前面元素的索引
在运用特有的迭代器时,我们就能做更多的操作了。

未经允许不得转载:IT技术网站 » Iterator
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载