在Java中,Iterator的作用就是為了便當(dāng)處置匯合中的元素。例如獲取和刪除匯合中的元素。
在JDK8,Iterator接口提供了如下辦法:
迭代器Iterator最根本的兩個(gè)辦法是next()和hasNext()。其中Java迭代器多了一個(gè)remove()辦法。在JDK8中又新增了forEachRemaining()辦法。
接下來,以ArrayList為例,看下迭代器在Java中的完成。
在ArrayList中,以內(nèi)部類的方式完成,每次調(diào)用iterator()辦法,都會(huì)newItr()。
先看一下ArrayList迭代器的完成類:
定義的參數(shù)如下:
1intcursor;//下標(biāo),默許值0;
2intlastRet=-1;//最后一個(gè)元素的下標(biāo),假如沒有返回-1;
3intexpectedModCount=modCount;//構(gòu)造修正(添加、刪除等操作)次數(shù),默許值0;
定義的辦法如下:
hasNext()辦法:
1publicbooleanhasNext(){
2returncursor!=size;
3}
當(dāng)匯合中不存在下一個(gè)元素,即曾經(jīng)遍歷至匯合末尾時(shí),該辦法返回false。hasNext辦法主要用于循環(huán)終止條件。
next()辦法:
復(fù)制代碼
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}
復(fù)制代碼
在執(zhí)行next()辦法時(shí),會(huì)先執(zhí)行checkForComodification()辦法,做一個(gè)判別(檢查所迭代的列表對(duì)象能否被修正過):
1finalvoidcheckForComodification(){
2if(modCount!=expectedModCount)thrownewConcurrentModificationException();
3}
在對(duì)匯合停止迭代過程中,不允許呈現(xiàn)迭代器以外的對(duì)元素的操作,由于這樣會(huì)產(chǎn)生平安隱患,java會(huì)拋出異常并發(fā)修正異常(ConcurrentModificationException),普通迭代器只支持在迭代過程中的刪除動(dòng)作。
假如在遍歷ArrayList時(shí),想添加元素和修正元素,能夠調(diào)用List匯合的特有迭代器ListIterator。
remove()辦法:
復(fù)制代碼
1publicvoidremove(){
2if(lastRet<0)thrownewIllegalStateException();
3checkForComodification();
4
5try{
6ArrayList.this.remove(lastRet);
7cursor=lastRet;
8lastRet=-1;
9expectedModCount=modCount;
10}catch(IndexOutOfBoundsExceptionex){
11thrownewConcurrentModificationException();
12}
13}
復(fù)制代碼
Java普通迭代器中獨(dú)一支持修正構(gòu)造的操作。在執(zhí)行完刪除操作后,會(huì)更新expectedModCount字段的值。
forEachRemaining()辦法:
復(fù)制代碼
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}
復(fù)制代碼
forEachRemaining()是JDK8中新增的辦法。forEachRemaining()運(yùn)用迭代器Iterator的一切元素,并且第二次調(diào)用它將不會(huì)做任何事情,由于不再有下一個(gè)元素。
一個(gè)運(yùn)用場(chǎng)景:取得對(duì)應(yīng)匯合的迭代器Iterator,然后您能夠開端迭代,next()直抵達(dá)到某個(gè)條件,然后運(yùn)用forEachRemaining()操作該Iterator上的其他局部。
接下來,看一下方才提到的ListIterator。
在普通的Iterator中,只能對(duì)元素停止獲取(next())和刪除(remove())的操作。而ListIterator提供了更多的辦法:
add(Ee):將指定的元素插入列表,插入位置為迭代器當(dāng)前位置之前
hasNext():以正向遍歷列表時(shí),假如列表迭代器后面還有元素,則返回true,否則返回false
hasPrevious():假如以逆向遍歷列表,列表迭代器前面還有元素,則返回true,否則返回false
next():返回列表中ListIterator指向位置后面的元素
nextIndex():返回列表中ListIterator所需位置后面元素的索引
previous():返回列表中ListIterator指向位置前面的元素
previousIndex():返回列表中ListIterator所需位置前面元素的索引
在運(yùn)用特有的迭代器時(shí),我們就能做更多的操作了。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)