java 數(shù)據(jù)結(jié)構(gòu)(4) Iterator

一、Iterator的好處--面向接口編程

參考Java里用Iterator遍歷一個(gè)ArrayList里的數(shù)據(jù)比直接用ArrayList里的方法訪問(wèn)整個(gè)List里的數(shù)據(jù)要好嗎

  • 更廣泛的使用范圍。
    Iterator迭代器針對(duì)Collection設(shè)計(jì),但get(int index)、remove(int index)等一類的方法并不是Collection接口的標(biāo)準(zhǔn),也就是說(shuō),對(duì)ArrayList,即List的實(shí)現(xiàn),你能使用這些方法,但對(duì)于Collection的其他實(shí)現(xiàn),如Set等,你可能就必須使用Iterator了。
  • 更好的異常控制。
    Iterator迭代器允許調(diào)用者在在迭代期間對(duì)迭代器所指向的Collection進(jìn)行remove等操作,而對(duì)于這種情況,一般的for(int i = 0; i < Collection.size(); i++)遍歷方式可能就會(huì)出現(xiàn)IndexOutOfBoundsException。
  • 更佳的性能。
    對(duì)于數(shù)組形式的Collection,例如問(wèn)題中的ArrayList,兩種遍歷方式可認(rèn)為性能幾乎一致;但對(duì)于鏈表形式的Collection,例如同樣是List實(shí)現(xiàn)的LinkedList,一般的for(int i = 0; i < Collection.size(); i++)遍歷方式可能是噩夢(mèng),因?yàn)樵趂or loop的內(nèi)部,執(zhí)行g(shù)et(int index)、remove(int index)等一類的方法時(shí)需要再次進(jìn)行部分遍歷。即Iterator會(huì)從一個(gè)節(jié)點(diǎn)直接通過(guò)next指針獲得下一個(gè)節(jié)點(diǎn),遍歷時(shí)間復(fù)雜度始終是O(n),而一般的for loop的時(shí)間復(fù)雜度在鏈表的情況下會(huì)上升至O(n^2),n很大時(shí),性能消耗非常恐怖。

另外補(bǔ)充兩點(diǎn):

  • 對(duì)于for循環(huán),我們還有一種叫做所謂for each的寫法,C#中就是for each,Java中是for(Object o : Collection os),這種寫法不僅僅是個(gè)語(yǔ)法糖,使代碼更漂亮、更簡(jiǎn)潔,更重要的是,for each實(shí)際上就是使用的迭代器,因此,code時(shí)始終使用foreach代替一般的for loop就對(duì)了!
        //以三種方式遍歷集合List
        
        List<String> list = new ArrayList<String>();
        
        list.add("a");
        list.add("b");
        list.add("c");
        
        System.out.println("----------方式1-----------");
        //第一種方式,普通for循環(huán)
        for(int i = 0; i < list.size(); i++)
        {
            System.out.println(list.get(i));
            
        }
        
        System.out.println("----------方式2-----------");
        //第二種方式,使用迭代器
        for(Iterator<String> iter = list.iterator(); iter.hasNext();)
        {
            System.out.println(iter.next());
        }
        System.out.println("----------方式3-----------");
        //第三種方式,使用增強(qiáng)型的for循環(huán)
        for(String str: list)
        {
            System.out.println(str);
            
        }

For-Each循環(huán)是JDK5.0的新特性(其他新特性比如泛型、自動(dòng)裝箱等)。當(dāng)遍歷集合或數(shù)組時(shí),如果需要訪問(wèn)集合或數(shù)組的下標(biāo),那么最好使用舊式的方式來(lái)實(shí)現(xiàn)循環(huán)或遍歷,而不要使用For-Each循環(huán),因?yàn)樗鼇G失了下標(biāo)信息。

  • code時(shí),遵循夠用原則,參數(shù)傳遞等盡量面向接口,而不是具體的實(shí)現(xiàn)類,這有利于代碼的兼容以及后續(xù)升級(jí)。例如方法:
    function(ArrayList os);
    如果在function中用不到os的ArrayList獨(dú)有的特性,List已經(jīng)夠用,則寫成下面的形式更好,這樣調(diào)用者就更輕松了,他可以提供ArrayList之外的數(shù)據(jù)類型,如LinkedList:
    function(List os);
    同理,再進(jìn)一步,甚至可以寫成如下形式:
    function(Collection os);
二、例子

參考java iterator背后機(jī)制

import java.util.*;
public class Muster {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        Iterator it = list.iterator();
        while(it.hasNext()){
            String str = (String) it.next();
            System.out.println(str);
        }
    }
}

Java中的Iterator功能比較簡(jiǎn)單,并且只能單向移動(dòng):
  (1) 使用方法iterator()要求容器返回一個(gè)Iterator。第一次調(diào)用Iterator的next()方法時(shí),它返回序列的第一個(gè)元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
  (2) 使用next()獲得序列中的下一個(gè)元素。
  (3) 使用hasNext()檢查序列中是否還有元素。
  (4) 使用remove()將迭代器新返回的元素刪除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,514評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,743評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,199評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,414評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,951評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,780評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,218評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,673評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,719評(píng)論 18 399
  • 第十天 權(quán)限修飾符 public protected default private 同一類 true true ...
    炙冰閱讀 548評(píng)論 0 1
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 886評(píng)論 0 1
  • 1 場(chǎng)景問(wèn)題# 1.1 工資表數(shù)據(jù)的整合## 考慮這樣一個(gè)實(shí)際應(yīng)用:整合工資表數(shù)據(jù)。 這個(gè)項(xiàng)目的背景是這樣的,項(xiàng)目...
    七寸知架構(gòu)閱讀 2,572評(píng)論 0 53
  • 下班,剛踏進(jìn)地鐵13號(hào)線。每天上下班都是這樣,從9號(hào)線轉(zhuǎn)11號(hào)線再轉(zhuǎn)13號(hào)線,從13號(hào)線轉(zhuǎn)11號(hào)線再轉(zhuǎn)9號(hào)線。來(lái)上...
    愛(ài)笑的小仙女閱讀 340評(píng)論 1 3