迭代器 java_Java設計模式8:迭代器模式

迭代器模式

迭代器模式又叫做游標(Cursor)模式,其作用是提供一種方法訪問一個容器元素中的各個對象,而又不暴露該對象的內部細節

迭代器模式結構

迭代器模式由以下角色組成:

1、迭代器角色

負責定義訪問和遍歷元素的接口

2、具體迭代器角色

實現迭代器接口,并要記錄遍歷中的當前位置

3、容器角色

負責提供創建具體迭代器角色的接口

4、具體容器角色

實現創建具體迭代器角色的接口,這個具體迭代器角色與該容器的結構相關

迭代器模式在JDK中的應用及解讀

迭代器模式就不自己寫例子了,直接使用JDK中的例子。為什么我們要使用迭代器模式,思考一個問題,假如我有一個ArrayList和一個LinkedList:

912a095f5096968190928ee9c65404db.png

如何去遍歷這兩個List相信每個人都很清楚:

3753225d03ba512934f564bfa0e7c22c.png

運行結果為:

cda66d78eaa5b7836ae0826c9f26b63d.png

這是因為恰好,我們知道ArrayList和LinkedList的訪問方式,有些喜歡研究的人知道ArrayList和LinkedList的內部結構,但如果現在我給你一個HashSet:

01e90e267374d881c0268cc93d842b1e.png

將如何遍歷?可能你還以為可以使用類似List的遍歷方式,不過很遺憾,HashSet中根本沒有提供get方法。

這時候就輪到迭代器出場了,不管是什么數據結構,不管你聽過還是沒聽過,不管你見過還是沒見過,只要它實現了Iterable接口,都可以用類似的方式去遍歷,我把ArrayList、LinkedList、HashSet的遍歷寫在一起:

e4792919238f51426ef3e5e211929ca1.png

看一下運行結果:

516208a1fac80eafe5c866bb385150b7.png

看到這就遍歷出來ArrayList、LinkedList、HashSet了,以后遇到一個集合,只要實現了iterable接口,也都可以類似這么遍歷。這就是開頭迭代器模式的定義說的,開發者不需要知道集合中如何去遍歷的細節,只管用類似的遍歷方法就好了。

Iterable接口和Iterator接口

這兩個都是迭代相關的接口,可以這么認為,實現了Iterable接口,則表示某個對象是可被迭代的;Iterator接口相當于是一個迭代器,實現了Iterator接口,等于具體定義了這個可被迭代的對象時如何進行迭代的。參看Iterable接口的定義:

f96a2b9a762532a6200ed45ec3557fd4.png

這樣對象就可以使用這個類的迭代器進行迭代了,一般Iterable和Iterator接口都是結合著一起使用的。為什么一定要實現Iterable接口而不直接實現Iterator接口了呢,這個問題我也是在自己寫了ArrayList和LinkedList的實現之后才想明白的,這么做確實有道理:

因為Iterator接口的核心方法next()或者hasNext()都是依賴于迭代器的當前迭代位置的。如果Collection直接實現Iterator接口,勢必導致集合對象中包含當前迭代位置的數據,當集合在不同方法間被傳遞時,由于當前迭代位置不可預置,那么next()方法的結果會變成不可預知的。除非再為Iterator接口添加一個reset()方法,用來重置當前迭代位置。但即使這樣,Collection也同時只能存在一個當前迭代位置。而Iterable,每次調用都返回一個從頭開始計數的迭代器,多個迭代器時互不干擾。

可能這么解釋不是很明白,再解釋明白一點,我自己寫的一個ArrayList,如果直接實現Iterator接口,那么勢必是這么寫的:

4b9448e7b23e3b5d24e2de5280c53e86.png

這么問題就來了,如果一個ArrayList實例被多個地方迭代,next()方法、hasNext()直接操作的是ArrayList中的資源,假如我在ArrayList中定義一個迭代位置的變量,那么對于不同調用處,這個迭代變量是共享的,線程A迭代的時候將迭代變量設置成了第5個位置,這時候切換到了線程B,對于線程B來講,就從第5個位置開始遍歷此ArrayList了,根本不是從0開始,如何正確迭代?

實現Iterable接口返回一個Iterator接口的實例就不一樣了,我為自己寫的ArrayList定義一個內部類:

363056ae497ec91d17edb2036ff537b5.png

每次都返回一個返回一個ArrayListIterator實例出去:

61bff0a316518ab7f352815f94a18cf7.png

這就保證了,即使是多處同時迭代這個ArrayList,依然每處都是從0開始迭代這個ArrayList實例的。

迭代器模式的優缺點

優點

1、簡化了便利方式,對于對象集合的遍歷,還是比較麻煩的,對于數組或者有序列表,我們還可以通過下標來獲取,但用戶需要在對集合很了解的情況下,才能自行遍歷對象(有時即使你了解了集合,還未必能直接遍歷,比如上面的HashSet就沒有提供get方法)。而引入了迭代器方法后,用戶用起來就簡單地多了

2、可以供多種遍歷方式,比如對于有序列表,可以正向遍歷也可以倒序遍歷,只要迭代器實現得好

3、封裝性好,用戶只需要得到迭代器就可以遍歷,而對于遍歷算法則不用去關心

缺點

對于比較簡單的遍歷(數組或者有序列表),使用迭代器方式遍歷較為繁瑣而且遍歷效率不高,使用迭代器的方式比較適合那些底層以鏈表形式實現的集合

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542328.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html二級下拉菜單模板,基于jQuery實現二級下拉菜單效果

本文通過代碼實例詳細介紹一下簡單的二級下拉菜單是如何實現的,當然還有更為復雜的二級菜單,不過先學會如何制作簡單的,分享給大家供大家參考,具體內容如下代碼如下:下拉菜單nav a{text-decoration:none;}nav>ul>…

給定一個整數判斷是否為素數_Ruby程序檢查給定數字是否為素數

給定一個整數判斷是否為素數檢查素數 (Checking prime number) Before getting into writing the code, let us understand what exactly the prime numbers are? So that we could easily design its logic and implement it in the code. Prime numbers are those numbers w…

python 正則findall右斜杠_python中正則表達式的使用

本文將介紹幾個最常用的正則符號,以及正則表達式的應用場景。如果說【數學表達式】刻畫的是數字的內在規律,那么【正則表達式】則是用來刻畫和描述字符串內在規律的表達式。記得剛接觸python時學習過slice,replace,split等方法&am…

JavaScript | 用戶定義函數的一些示例

1) Design a function, print message and assign the function to a variable and print it like a function 1)設計一個功能&#xff0c;打印消息并將該功能分配給變量&#xff0c;然后像打印功能一樣打印 <html lang"en"><head><script>functi…

網易 html5,別再想不開做H5了

寫這篇文章的時候網易噠噠《飼養手冊》H5刷屏了&#xff0c;但我們依舊不建議品牌做H5。H5作為大眾傳播工具的時代&#xff0c;已經過去了。盡管去年有很多H5曾經刷屏過&#xff0c;但在當時我們就一直跟朋友說&#xff0c;不要再嘗試H5了&#xff0c;性價比根本算不過來&#…

python打開word后再關閉再打開出錯_用Python寫了個程序調用word,運行完后再手動打開word文檔就變慢了,這是為啥?...

公司歸檔文件比較麻煩&#xff0c;于是用Python寫了個程序自動歸檔&#xff0c;運行無錯誤。但是運行完后問題就來了&#xff0c;自己手動打開word文檔時速度變得奇慢&#xff0c;打開一個文檔需要1~2min,請各位同仁幫我看看。下為源代碼#歸檔.pyimport osimport refrom win32c…

編程 mcq_MCQ | 8255 PPI(可編程外圍接口)

編程 mcqQuestion 1: How many pins does the 8255 PPI IC contains? 問題1&#xff1a;8255 PPI IC包含多少個引腳&#xff1f; 24 24 20 20 32 32 40 40 Answer: d. 40 答案&#xff1a;d。 40 Question 2: In which mode do all the Ports of the 8255 PPI work as Input…

flex 修改生成html,CSS Flex –動畫教程

如果一張圖片勝過千言萬語 —— 那么動畫呢&#xff1f; Flex 無法通過文字或靜態圖像有效地完全解釋。為了鞏固你對flex的了解&#xff0c;我制作了這些動畫演示。注意 overflow: hidden 行為類型是默認值&#xff0c;因為 flex-wrap 還未設置。為了獲得更好的想法&#xff0c…

c#c#繼承窗體_C#繼承能力問題和解答 套裝5

c#c#繼承窗體1) Which keyword is used to call a superclass constructor from child class? supertopconstbase Answer & Explanation Correct answer: 4base In C#.NET, base keyword is used to call a base class constructor from a derived class. 1)使用哪個關鍵字…

python php 網站_python php網站

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技術人對外發布原創技術內容的最大平臺&…

陜西2021高考成績在哪查詢,2021陜西高考成績查詢入口

2021陜西高考成績查詢入口2021-05-13 19:38:37文/張敏有很多同學在關注2021年陜西高考成績的查詢方式&#xff0c;為了方便考生們查詢成績&#xff0c;小編整理了陜西高考成績查詢入口&#xff0c;希望對同學們有幫助。2021陜西高考成績查詢通道高考成績查詢過后應該做什么1、了…

Can’t Activate Reporting Services Service in SharePoint

訪問sharepoint的reporing service 的報表的時候莫名其妙的報錯&#xff1a; The requested service, http://amatltapp02:32843/1dacf49a2f7a4a6daa8db5768539893f/ReportingWebService.svc could not be activated. See the servers diagnostic trace logs for more informat…

scala python_Scala與Python | 哪種編程語言更好

scala pythonScala is a general-purpose programming language developed by Martin Odersky in 2004. Scala是Martin Odersky在2004年開發的通用編程語言。 Both Scala and Python are general purpose programming that is used in Data Science that supports Object Orie…

查找文件中每行第二個單詞_日語單詞中的長短音區別在哪里,日語長短音發音有什么規律...

日語單詞記憶長短音規律一、如果單詞的漢字在中文漢語拼音中是前鼻音&#xff0c;在日語讀音中就會帶撥音「ん」&#xff1b; 如果單詞的漢字在中文漢語拼音中是后鼻音&#xff0c;在日語讀音中就會帶有長音。例&#xff1a;専門&#xff08;zhuan men&#xff09;&#xff0d;…

SQL Server 執行計劃利用統計信息對數據行的預估原理二(為什么復合索引列順序會影響到執行計劃對數據行的預估)...

本文出處&#xff1a;http://www.cnblogs.com/wy123/p/6008477.html 關于統計信息對數據行數做預估&#xff0c;之前寫過對非相關列&#xff08;單獨或者單獨的索引列&#xff09;進行預估時候的算法&#xff0c;參考這里。  今天來寫一下統計信息對于復合索引在預估時候的計…

計算機三四級網絡技術,全國計算機等級考試四級網絡技術論述題真題3

1.(2003年)網絡安全策略設計的重要內容之一是&#xff1a;確定當網絡安全受到威脅時應采取的應急措施。當我們發現網絡受到非法侵入與攻擊時&#xff0c;所能采取的行動方案基本上有兩種&#xff1a;保護方式與跟蹤方式。請根據你對網絡安全方面知識的了解&#xff0c;討論以下…

哈密頓路徑_檢查圖形是否為哈密頓量(哈密頓路徑)

哈密頓路徑Problem Statement: 問題陳述&#xff1a; Given a graph G. you have to find out that that graph is Hamiltonian or not. 給定圖G。 您必須找出該圖是否為哈密頓量 。 Example: 例&#xff1a; Input: 輸入&#xff1a; Output: 1 輸出1 Because here is a …

京東自動下單軟件_黃牛軟件自動下單秒殺商品 警方用科技手段打擊

法制日報全媒體記者 張維定了10個鬧鐘,也搶不到一瓶茅臺&#xff1b;等了很久的iPhone新手機,打開網頁就秒沒……或許并不是因為你的手速、網速慢,而是黃牛黨在用軟件和你搶商品。近日,在“凈網2019”專項行動中,阿里安全協助江蘇省南通市公安局成功打掉了一個制作銷售黃牛軟件…

Mysql基礎之DML語句

增 1 給表的所有字段插入數據 INSERT INTO 表名 VALUES(值1&#xff0c;值2&#xff0c;值3&#xff0c;...&#xff0c;值n)&#xff1b; 2 給表的指定字段插入數據 INSERT INTO 表名(屬性1&#xff0c;屬性2&#xff0c;...&#xff0c;屬性n) VALUES(值1&#xff0c;值2&a…

河南招教考試計算機專業知識,河南教師招聘考試《計算機網絡技術基礎》知識點歸納七...

河南教師招聘考試《計算機網絡技術基礎》知識點歸納七1.ADSL是非對稱數字用戶線路&#xff0c;其下行速率為1.5&#xff5e;8 Mb/s&#xff0c;而上行速率則為16&#xff5e;640 kb/s。在一對銅雙絞線上的傳送距離可達5km左右&#xff0c;可同時上網打電話&#xff0c;互不影響…