溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java容器類源碼分析之Iterator與ListIterator迭代器(基于JDK8)

發(fā)布時間:2020-06-05 21:32:12 來源:網(wǎng)絡(luò) 閱讀:452 作者:沙漏半杯 欄目:編程語言

一、基本概念

??

? ? 迭代器是一個對象,也是一種設(shè)計模式,Java有兩個用來實實現(xiàn)迭代器的接口,分別是Iterator接口和繼承自Iterator的ListIterator接口。實現(xiàn)迭代器接口的類的對象有遍歷集合對象,選擇集合中的元素和刪除集合中元素的方法。而在使用它時不必知道該集合對象底層的結(jié)構(gòu)。Java類庫中實現(xiàn)Iterator接口的迭代器只能正向遍歷集合中的元素,而實現(xiàn)ListIterator接口的迭代器不僅能夠正向遍歷,還能夠反向遍歷集合中的元素。

?

二、源碼分析

?

2.1、Iterator接口與ListIterator接口的繼承與實現(xiàn)

?

Java容器類源碼分析之Iterator與ListIterator迭代器(基于JDK8)

?

圖2.1 ?Java迭代器類的繼承與接口實現(xiàn)(部分)

?

? ? ListIterator接口繼承了Iterator接口。在AbstractList、ArrayList和Vector這三個類中的內(nèi)部類ListItr實現(xiàn)了ListIterator接口,這三個類的內(nèi)部類ListItr又分別繼承了在這三個類中實現(xiàn)了Iterator接口的內(nèi)部類Itr。實現(xiàn)ListIterator的類還有LinkedList的內(nèi)部類ListItr。實現(xiàn)Iterator的類還有LinkedList的內(nèi)部類DescendingIterator,HashMap的內(nèi)部類EntryIterator,KeyIterator,ValueIterator,以及TreeMap的內(nèi)部類PrivateEntryIterator等。

2.2、迭代器接口方法

? ? ? ?

? ? ? ??1)迭代器的向前移動與向后移動圖解

?

Java容器類源碼分析之Iterator與ListIterator迭代器(基于JDK8)

?

? ? ? ???2)Iterator接口方法


??Iterator<E>?

???UnsupportedOperationException("remove"?

??forEachRemaining(Consumer<???E>


?

? ?? ? 3)ListIterator接口方法

?

??ListIterator<E>??Iterator<E>?hasNext();

????
???
?????nextIndex();

?????previousIndex();

????

?????set(E?e);

?????add(E?e);}


?

2.3、容器類與迭代器的關(guān)系

?

? ??? ?1)Iterator接口。閱讀源碼可知,Collectiion接口實現(xiàn)了Iterable接口,Iterable有一個返回一個Iterator<T>對象的iterator()方法,所以繼承和實現(xiàn)了Collection接口的所有容器類及其子類和實現(xiàn)類都有一個返回Iterator對象的的iterator()方法。Java中有很多容器類中都設(shè)計有實現(xiàn)了Iterator接口的內(nèi)部類,如ArrayList和LinkedList等類。HashMap和TreeMap類中也包含有實現(xiàn)了Iterator的內(nèi)部類,來對Map中的KeySet、Value和EntrySet進(jìn)行迭代。Iterable接口的源代碼如下:


<T>??forEach(Consumer<???T>?(T?t?:??Spliterator<T>?Spliterators.spliteratorUnknownSize(iterator(),?0


?? ? ? ?2)ListIterator接口。查看源碼可以發(fā)現(xiàn),List接口中有兩個返回ListIterator<T>對象的方法,如下。List接口下的的ArrayList和LinkedList都有返回ListIterator對象的方法。

?

ListIterator<E>?listIterator();//實現(xiàn)這個方法,該方法返回一個ListIterator迭代器對象,迭代器初始化后,一般迭代器位于在容器第一個元素后面。ListIterator<E>?listIterator(int?index);//實現(xiàn)這個方法,返回一個指定了開始遍歷容器時迭代器初始位置的ListIterator迭代器對象

?

?

  • ArrayList類設(shè)計有實現(xiàn)了ListIterator接口的內(nèi)部類ListItr(不過ArrayList的listIterator(final int index)方法并未使用這個內(nèi)部類,而是在方法中又設(shè)計了一個ListIterator匿名內(nèi)部類作為方法返回值,可以發(fā)現(xiàn)ArrayList的Iterator()方法也是調(diào)用了這個方法來構(gòu)建迭代器對象)。ArrayList類中部分有關(guān)源碼如下

????ListItr??Itr??ListIterator<E>=

?

???Iterator<E>?ListIterator<E>?listIterator(???offset?=???ListIterator<E>?cursor?=?lastRet?=?-1?expectedModCount?=?ArrayList.??cursor?!=?SubList.


? ? ?

  • ? LinkedList類也有一個內(nèi)部類ListItr實現(xiàn)了ListIterator接口,LinkedList的listIterator()方法返回了這個內(nèi)部類的實例。LinkedList中部分有關(guān)源碼如下


????public?ListIterator<E>?listIterator(int?index)?{
????????checkPositionIndex(index);????????return?new?ListItr(index);
????}????private?class?ListItr?implements?ListIterator<E>?{

?

歡迎工作一到五年的Java工程師朋友們加入Java技術(shù)交流:659270626
群內(nèi)提供免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

?


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI