日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

迭代器 java_Java设计模式8:迭代器模式

發(fā)布時(shí)間:2025/3/11 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迭代器 java_Java设计模式8:迭代器模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

迭代器模式

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

迭代器模式結(jié)構(gòu)

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

1、迭代器角色

負(fù)責(zé)定義訪問和遍歷元素的接口

2、具體迭代器角色

實(shí)現(xiàn)迭代器接口,并要記錄遍歷中的當(dāng)前位置

3、容器角色

負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口

4、具體容器角色

實(shí)現(xiàn)創(chuàng)建具體迭代器角色的接口,這個(gè)具體迭代器角色與該容器的結(jié)構(gòu)相關(guān)

迭代器模式在JDK中的應(yīng)用及解讀

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

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

運(yùn)行結(jié)果為:

這是因?yàn)榍『?#xff0c;我們知道ArrayList和LinkedList的訪問方式,有些喜歡研究的人知道ArrayList和LinkedList的內(nèi)部結(jié)構(gòu),但如果現(xiàn)在我給你一個(gè)HashSet:

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

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

看一下運(yùn)行結(jié)果:

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

Iterable接口和Iterator接口

這兩個(gè)都是迭代相關(guān)的接口,可以這么認(rèn)為,實(shí)現(xiàn)了Iterable接口,則表示某個(gè)對象是可被迭代的;Iterator接口相當(dāng)于是一個(gè)迭代器,實(shí)現(xiàn)了Iterator接口,等于具體定義了這個(gè)可被迭代的對象時(shí)如何進(jìn)行迭代的。參看Iterable接口的定義:

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

因?yàn)镮terator接口的核心方法next()或者h(yuǎn)asNext()都是依賴于迭代器的當(dāng)前迭代位置的。如果Collection直接實(shí)現(xiàn)Iterator接口,勢必導(dǎo)致集合對象中包含當(dāng)前迭代位置的數(shù)據(jù),當(dāng)集合在不同方法間被傳遞時(shí),由于當(dāng)前迭代位置不可預(yù)置,那么next()方法的結(jié)果會變成不可預(yù)知的。除非再為Iterator接口添加一個(gè)reset()方法,用來重置當(dāng)前迭代位置。但即使這樣,Collection也同時(shí)只能存在一個(gè)當(dāng)前迭代位置。而Iterable,每次調(diào)用都返回一個(gè)從頭開始計(jì)數(shù)的迭代器,多個(gè)迭代器時(shí)互不干擾。

可能這么解釋不是很明白,再解釋明白一點(diǎn),我自己寫的一個(gè)ArrayList,如果直接實(shí)現(xiàn)Iterator接口,那么勢必是這么寫的:

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

實(shí)現(xiàn)Iterable接口返回一個(gè)Iterator接口的實(shí)例就不一樣了,我為自己寫的ArrayList定義一個(gè)內(nèi)部類:

每次都返回一個(gè)返回一個(gè)ArrayListIterator實(shí)例出去:

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

迭代器模式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

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

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

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

缺點(diǎn)

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

總結(jié)

以上是生活随笔為你收集整理的迭代器 java_Java设计模式8:迭代器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。