中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

發布時間:2020-06-05 21:32:12 來源:網絡 閱讀:452 作者:沙漏半杯 欄目:編程語言

一、基本概念

??

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

?

二、源碼分析

?

2.1、Iterator接口與ListIterator接口的繼承與實現

?

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

?

圖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)迭代器的向前移動與向后移動圖解

?

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、容器類與迭代器的關系

?

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


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


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

?

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

?

?

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

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

?

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


? ? ?

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


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

?

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

?


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铁岭县| 禄丰县| 湟中县| 阳信县| 梅州市| 银川市| 高尔夫| 武隆县| 泰宁县| 盐池县| 湖北省| 车险| 固始县| 长海县| 巴塘县| 溧阳市| 镇康县| 玛沁县| 门头沟区| 从江县| 刚察县| 石河子市| 洮南市| 犍为县| 新邵县| 济源市| 新余市| 平原县| 建昌县| 顺平县| 榆社县| 玛沁县| 安义县| 临邑县| 康平县| 砚山县| 兴城市| 蕉岭县| 银川市| 奈曼旗| 信阳市|