精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java源碼分析 深入探討Iterator模式

開發(fā) 后端
本文將從分析源碼入手,深入研究一個集合類的內部結構,以及遍歷集合的迭代模式的Java源碼實現內幕。

Java.util包中包含了一系列重要的集合類。本文將從分析源碼入手,深入研究一個集合類的內部結構,以及遍歷集合的迭代模式的Java源碼實現內幕。

下面我們先簡單討論一個根接口Collection,然后分析一個抽象類AbstractList和它的對應Iterator接口,并仔細研究迭代子模式的實現原理。

本文討論的Java源碼版本是JDK 1.4.2,因為JDK 1.5在Java.util中使用了很多泛型代碼,為了簡化問題,所以我們還是討論1.4版本的代碼。

集合類的根接口Collection

Collection接口是所有集合類的根類型。它的一個主要的接口方法是:

boolean add(Object c)
 
add()方法將添加一個新元素。注意這個方法會返回一個boolean,但是返回值不是表示添加成功與否。仔細閱讀doc可以看 到,Collection規(guī)定:如果一個集合拒絕添加這個元素,無論任何原因,都必須拋出異常。這個返回值表示的意義是add()方法執(zhí)行后,集合的內容 是否改變了(就是元素有無數量,位置等變化),這是由具體類實現的。即:如果方法出錯,總會拋出異常;返回值僅僅表示該方法執(zhí)行后這個 Collection的內容有無變化。

類似的還有:

  1. boolean addAll(Collection c);      
  2. boolean remove(Object o);      
  3. boolean removeAll(Collection c);      
  4. boolean remainAll(Collection c); 

Object[] toArray()方法很簡單,把集合轉換成數組返回。Object[] toArray(Object[] a)方法就有點復雜了,首先,返回的Object[]仍然是把集合的所有元素變成的數組,但是類型和參數a的類型是相同的,比如執(zhí)行:

String[] o = (String[])c.toArray(new String[0]);
 
得到的o實際類型是String[]。

其次,如果參數a的大小裝不下集合的所有元素,返回的將是一個新的數組。如果參數a的大小能裝下集合的所有元素,則返回的還是a,但a的內容用集合的元素來填充。尤其要注意的是,如果a的大小比集合元素的個數還多,a后面的部分全部被置為null。

***一個最重要的方法是iterator(),返回一個Iterator(迭代子),用于遍歷集合的所有元素。

用Iterator模式實現遍歷集合

Iterator模式是用于遍歷集合類的標準訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向客戶端暴露集合的內部結構。

例如,如果沒有使用Iterator,遍歷一個數組的方法是使用索引:

  1. for(int i=0; i<array.size();   
  2. i++) { ... get(i) ... } 

而訪問一個鏈表(LinkedList)又必須使用while循環(huán):

  1. while((e=e.next())!=null)   
  2. { ... e.data() ... } 

 以上兩種方法客戶端都必須事先知道集合的內部結構,訪問代碼和集合本身是緊耦合,無法將訪問邏輯從集合類和客戶端代碼中分離出來,每一種集合對應一種遍歷方法,客戶端代碼無法復用。

更恐怖的是,如果以后需要把ArrayList更換為LinkedList,則原來的客戶端代碼必須全部重寫。

為解決以上問題,Iterator模式總是用同一種邏輯來遍歷集合:

  1. for(Iterator it = c.iterater();   
  2. it.hasNext(); ) { ... } 

奧秘在于客戶端自身不維護遍歷集合的"指針",所有的內部狀態(tài)(如當前元素位置,是否有下一個元素)都由Iterator來維護,而這個Iterator由集合類通過工廠方法生成,因此,它知道如何遍歷整個集合。

客戶端從不直接和集合類打交道,它總是控制Iterator,向它發(fā)送"向前","向后","取當前元素"的命令,就可以間接遍歷整個集合。

首先看看Java.util.Iterator接口的定義:

  1. public interface Iterator   
  2. {        boolean hasNext();          
  3. Object next();        void remove();    } 

依賴前兩個方法就能完成遍歷,典型的代碼如下:

  1. for(Iterator it = c.iterator();   
  2. it.hasNext(); )   
  3. {        Object o = it.next();          
  4. // 對o的操作...    } 

在JDK1.5中,還對上面的代碼在語法上作了簡化:

// Type是具體的類型,如String。    for(Type t : c) {        // 對t的操作...    }
 
每一種集合類返回的Iterator具體類型可能不同,Array可能返回ArrayIterator,Set可能返回 SetIterator,Tree可能返回TreeIterator,但是它們都實現了Iterator接口,因此,客戶端不關心到底是哪種 Iterator,它只需要獲得這個Iterator接口即可,這就是面向對象的威力。

Iterator源碼剖析


讓我們來看看AbstracyList如何創(chuàng)建Iterator。首先AbstractList定義了一個內部類(inner class):

private class Itr implements Iterator {        ...    }
 

而iterator()方法的定義是:

  1. public Iterator iterator()   
  2. {        return new Itr();    }

因此客戶端不知道它通過Iterator it = a.iterator();所獲得的Iterator的真正類型。

現在我們關心的是這個申明為private的Itr類是如何實現遍歷AbstractList的:

  1. private class Itr implements Iterator   
  2. {        int cursor = 0;          
  3. int lastRet = -1;          
  4. int expectedModCount = modCount;    } 

Itr類依靠3個int變量(還有一個隱含的AbstractList的引用)來實現遍歷,cursor是下一次next()調用時元素的位置,***次調用next()將返回索引為0的元素。lastRet記錄上一次游標所在位置,因此它總是比cursor少1。

變量cursor和集合的元素個數決定hasNext():

  1. public boolean hasNext()   
  2. {        return cursor != size();    } 

方法next()返回的是索引為cursor的元素,然后修改cursor和lastRet的值:

  1. public Object next() {        checkForComodification();          
  2. try {            Object next = get(cursor);              
  3. lastRet = cursor++;              
  4. return next;  
  5.         } catch(IndexOutOfBoundsException e)   
  6. {            checkForComodification();              
  7. throw new NoSuchElementException();        }    } 

expectedModCount表示期待的modCount值,用來判斷在遍歷過程中集合是否被修改過。AbstractList包含一個 modCount變量,它的初始值是0,當集合每被修改一次時(調用add,remove等方法),modCount加1。因此,modCount如果不 變,表示集合內容未被修改。

Itr初始化時用expectedModCount記錄集合的modCount變量,此后在必要的地方它會檢測modCount的值:

  1. final void checkForComodification()   
  2. {        if   
  3. (modCount != expectedModCount)              
  4. throw new ConcurrentModificationException();    } 

如果modCount與一開始記錄在expectedModeCount中的值不等,說明集合內容被修改過,此時會拋出ConcurrentModificationException。

這個ConcurrentModificationException是RuntimeException,不要在客戶端捕獲它。如果發(fā)生此異常,說明程序代碼的編寫有問題,應該仔細檢查代碼而不是在catch中忽略它。

但是調用Iterator自身的remove()方法刪除當前元素是完全沒有問題的,因為在這個方法中會自動同步expectedModCount和modCount的值:

  1. public void remove()   
  2. {        ...        AbstractList.this.remove(lastRet);  
  3.         ...          
  4. // 在調用了集合的remove()方法之后重新設置了expectedModCount:          
  5. expectedModCount = modCount;        ...    } 

要確保遍歷過程順利完成,必須保證遍歷過程中不更改集合的內容(Iterator的remove()方法除外),因此,確保遍歷可靠的原則是只在一個線程中使用這個集合,或者在多線程中對遍歷代碼進行同步。

***給個完整的示例:

  1. Collection c = new ArrayList();      
  2. c.add("abc");    c.add("xyz");      
  3. for(Iterator it = c.iterator();   
  4. it.hasNext(); ) {        String s = (String)it.next();          
  5. System.out.println(s);    } 

如果你把***行代碼的ArrayList換成LinkedList或Vector,剩下的代碼不用改動一行就能編譯,而且功能不變,這就是針對抽象編程的原則:對具體類的依賴性最小。

【編輯推薦】

  1. 對Java編程思想的忠告
  2. 和我共同了解Java是什么
  3. 著名的Java論壇和網站
  4. 2009年十大Java技術解決方案
  5. 2008最值得學習的五種JAVA技術
責任編輯:仲衡 來源: 百度博客
相關推薦

2009-12-23 16:13:00

WPF Attache

2011-02-25 09:23:00

Java類加載器

2015-09-02 08:57:56

JavaHashMap工作原理

2010-11-22 14:18:32

MySQL鎖機制

2010-07-21 09:38:15

PHP緩存技術

2009-11-20 17:17:08

Oracle函數索引

2021-05-17 05:36:02

CSS 文字動畫技巧

2023-01-12 17:18:06

數據庫多云

2009-08-27 11:27:58

foreach語句C# foreach語

2010-03-31 14:58:03

云計算

2010-03-05 13:44:00

Python序列

2024-01-26 06:42:05

Redis數據結構

2009-12-11 11:08:31

靜態(tài)路由策略

2012-02-28 14:43:43

2009-12-14 14:40:10

Ruby全局域變量

2017-01-03 17:57:46

Android異步精髓Handler

2009-12-07 16:07:03

PHP類的繼承

2009-11-12 13:56:54

2009-10-16 09:17:39

屏蔽布線系統

2013-07-11 09:45:48

扁平化扁平化設計
點贊
收藏

51CTO技術棧公眾號

91成人在线免费视频| 免费看欧美黑人毛片| 136福利视频导航| 欧美日韩p片| 日韩电视剧免费观看网站| 久艹视频在线免费观看| 黄色大片在线免费观看| 精品一二三四区| 欧美精品久久久久久久免费观看| 中文字幕人妻一区二区| 欧美在线se| 欧美日韩国产专区| 中文字幕一区二区三区四区五区六区 | 亚洲免费在线电影| 久久精品第九区免费观看| 亚洲无码精品在线播放| 亚洲日韩视频| 久久天天躁夜夜躁狠狠躁2022| 亚洲av网址在线| 国产一区一区| 欧美日韩午夜精品| 奇米精品一区二区三区| www.欧美日本韩国| 国产女人18毛片水真多成人如厕| 国产精品美女黄网| 国产精品免费无遮挡| 久久蜜桃精品| 26uuu亚洲国产精品| 成年人一级黄色片| 日韩在线观看| 亚洲欧洲偷拍精品| 少妇精品一区二区| 一区二区三区四区精品视频| 欧美日本视频在线| 欧美一级特黄a| 一个人看的www视频在线免费观看| 曰韩精品一区二区| 一区二区三区我不卡| 黄色大片在线免费观看| 91毛片在线观看| 97神马电影| 国产精品视频一二区| 日韩在线观看一区二区| 欧美在线视频在线播放完整版免费观看 | 国产视频一二三四区| 日韩精品成人一区二区三区| 26uuu亚洲伊人春色| 日本学生初尝黑人巨免费视频| 一区二区电影| 欧美剧在线观看| www欧美com| 91精品国产乱码久久久久久| www欧美日韩| 黑人狂躁日本娇小| 99久久婷婷国产综合精品电影√| 影音先锋日韩有码| 免费看日本黄色片| 国产一区二区三区日韩精品 | 免费在线观看黄色网| 中文字幕av不卡| 亚洲欧美日韩另类精品一区二区三区| 国产三级视频在线看| 国产欧美日韩精品一区| 青娱乐一区二区| 国产高清在线看| 国产精品视频线看| 亚洲国产成人不卡| 蜜桃视频网站在线| 亚洲天天做日日做天天谢日日欢 | 在线网址91| 亚洲综合成人在线视频| av免费观看大全| 中文字幕乱码在线播放| 在线视频一区二区三区| 久久99爱视频| 亚洲天堂av资源在线观看| 精品国产乱码久久久久久久| 一区二区不卡免费视频| 成人精品天堂一区二区三区| 久久精品91久久久久久再现| 国产一级在线播放| 久久综合影音| 成人淫片在线看| 少妇精品视频一区二区| 久久人人超碰精品| 一本久久a久久精品vr综合| av片在线观看| 黑丝美女久久久| 欧美成人福利在线观看| youjizz欧美| 亚洲人成电影网站色www| 日本 欧美 国产| 亚洲国产婷婷| 国产精品视频色| 黄频网站在线观看| 久久久99免费| 久久久99精品视频| 另类中文字幕国产精品| 欧美成人福利视频| 韩国三级hd中文字幕| 亚洲国产精品91| 日本精品久久久久影院| 国产精品福利电影| 久久中文娱乐网| 8x8x华人在线| 韩国理伦片久久电影网| 亚洲国产精品成人va在线观看| 中文天堂资源在线| 99成人在线| 成人信息集中地欧美| 欧美孕妇孕交| 亚洲影院免费观看| 亚洲国产高清av| 日韩理论电影中文字幕| 欧美成人性色生活仑片| 亚洲天堂视频在线播放| aaa国产一区| 996这里只有精品| 欧美视频精品| 亚洲一二三在线| 国产香蕉在线视频| 国产乱子伦视频一区二区三区| 日本精品一区二区| 欧美aa在线观看| 亚洲а∨天堂久久精品9966| 日本精品在线免费观看| 青青草国产成人av片免费| 精品在线观看一区二区| 欧美日韩色网| 欧美一二三区在线观看| 日本黄色片免费观看| 日韩电影免费在线看| 久久综合色一本| yellow字幕网在线| 日韩美一区二区三区| 国产老头老太做爰视频| 久久99精品一区二区三区| 日韩一区二区三区资源| 婷婷午夜社区一区| 亚洲男女自偷自拍图片另类| 看片网址国产福利av中文字幕| www.在线成人| 亚洲熟妇无码一区二区三区导航| 6080成人| 91精品国产亚洲| 日韩在线观看视频网站| 亚洲电影在线免费观看| 特级特黄刘亦菲aaa级| 在线免费高清一区二区三区| 国产传媒一区二区三区| 丰满大乳少妇在线观看网站| 亚洲精品在线观| 日韩经典在线观看| 91碰在线视频| 国产精品亚洲αv天堂无码| 亚洲国产精品嫩草影院久久av| 97色在线播放视频| 日韩精品福利| 91久久国产最好的精华液| 色欲AV无码精品一区二区久久| 玖玖精品视频| 亚洲精品永久www嫩草| 欧美天堂在线| 久久成人18免费网站| 亚洲第一页视频| 欧美日韩性生活视频| a毛片毛片av永久免费| 免费观看日韩电影| 99久re热视频精品98| 涩涩屋成人免费视频软件| 欧美激情亚洲综合一区| 亚洲欧洲精品视频| 欧美视频中文字幕| 欧美老熟妇一区二区三区| 成人ar影院免费观看视频| 欧美一级片中文字幕| 色婷婷热久久| dy888夜精品国产专区| 亚洲永久av| 久久久av电影| 亚州视频一区二区三区| 欧美吻胸吃奶大尺度电影 | 亚洲va天堂va国产va久| 法国伦理少妇愉情| 精品中文字幕一区二区小辣椒| 国产欧美精品aaaaaa片| 亚洲性视频大全| 国产免费亚洲高清| 91超碰国产在线| 色偷偷噜噜噜亚洲男人的天堂| 国产熟女一区二区三区五月婷| 五月激情丁香一区二区三区| 亚洲一级片在线播放| 国产69精品久久久久毛片| 亚洲中文字幕久久精品无码喷水| 亚洲影视一区二区三区| 欧美国产综合视频| 麻豆国产一区二区三区四区| 2019亚洲日韩新视频| 国产区在线看| 亚洲欧洲黄色网| 亚洲精品久久久久久久久久 | 久久久久久久影院| av在线免费观看网站| 亚洲大胆人体视频| 91激情在线观看| 色综合婷婷久久| 妺妺窝人体色www在线下载| 中文字幕免费不卡| av鲁丝一区鲁丝二区鲁丝三区| 激情图片小说一区| 久久久久狠狠高潮亚洲精品| 在线播放日韩| 亚洲第一页在线视频| 精品在线99| 久久99精品国产一区二区三区| 韩国三级大全久久网站| 国产精品国产三级国产aⅴ浪潮| 99爱在线视频| 久久91亚洲精品中文字幕| aiai在线| 亚洲人成电影网站色…| 日韩二区三区| 亚洲风情亚aⅴ在线发布| 成人激情四射网| 制服.丝袜.亚洲.另类.中文| 国产偷人爽久久久久久老妇app | 欧美黑人性生活视频| 免费在线视频欧美| 在线观看精品自拍私拍| 国产在线三区| 亚洲欧美成人精品| 天天操天天操天天操| 精品国产伦一区二区三区观看方式 | 日本黄色小说视频| ●精品国产综合乱码久久久久 | 视频一区二区在线播放| 日韩精品一区二区在线观看| 国产女人高潮时对白| 777欧美精品| 国产一区二区三区四区视频| 欧美色成人综合| 亚洲天堂视频网| 精品1区2区3区| 亚洲综合精品国产一区二区三区| 欧美无人高清视频在线观看| 中国一区二区视频| 欧美日韩国产在线观看| 中文有码在线播放| 欧美日本精品一区二区三区| 91禁在线观看| 日韩视频永久免费| 亚洲国产精品成人久久蜜臀| 亚洲а∨天堂久久精品喷水| 国产刺激高潮av| 亚洲国产精品大全| 天堂在线中文字幕| 亚洲美女视频网| yiren22综合网成人| 中文字幕日本欧美| 免费黄色网址在线观看| 久精品免费视频| 国产传媒在线观看| 国产成人综合精品| 欧美亚洲人成在线| 成人在线观看网址| 欧亚精品一区| 五月天综合网| 你懂的国产精品永久在线| 免费在线看黄色片| 羞羞答答国产精品www一本| 国产精品人人爽人人爽| 久久99久久99| 欧美激情 亚洲| 国产亚洲欧美日韩在线一区| 国产视频精品免费| 亚洲高清不卡在线| 国产黄色免费视频| 91精品国产色综合久久不卡蜜臀 | 在线免费观看一区二区| 337p亚洲精品色噜噜| 秋霞视频一区二区| 国产一区二区日韩| 18加网站在线| 日本欧美爱爱爱| 疯狂欧洲av久久成人av电影| 国产日韩在线一区二区三区| 成人国产精品一级毛片视频| 美女黄色免费看| 日本中文一区二区三区| 亚洲国产综合av| 久久久精品人体av艺术| 欧美成人黄色网| 91福利在线观看| 亚洲黄色在线播放| 一区二区三区www| av成人福利| 成人激情视频网| 亚洲激情77| 真实国产乱子伦对白视频| 免费观看30秒视频久久| 欧美一区二区免费在线观看| 日韩一区欧美小说| 国产又大又黄视频| 日韩午夜在线影院| 日本三级在线播放完整版| 2020国产精品视频| 久久久久九九精品影院| 午夜精品美女久久久久av福利| 日韩午夜av| 香蕉视频在线观看黄| 国产精品久久久久久久久图文区 | 久热成人在线视频| 黄色短视频在线观看| 亚洲精品中文在线| 中文字幕在线播放av| 国产午夜精品麻豆| 99色在线观看| 超碰97网站| 久久久久久久久久久9不雅视频 | 国产盗摄女厕一区二区三区| 奇米网一区二区| 色婷婷综合久久久久中文一区二区| 国产富婆一级全黄大片| 北条麻妃一区二区三区中文字幕| 久久野战av| 欧美日韩电影一区二区| 国产精品毛片| 国产精品手机在线观看| 亚洲精品你懂的| 中文字幕观看视频| 亚洲香蕉成人av网站在线观看| 亚洲同志男男gay1069网站| 国产精品久久久久久久久久久久冷 | 18禁免费观看网站| 成人一区二区三区在线观看| 国产自产在线视频一区| 国产www视频在线观看| 91老司机在线| 91成人精品| 欧美一级特黄aaa| 国产精品成人午夜| 亚洲一级特黄毛片| 神马国产精品影院av| 国产精品一区二区免费福利视频 | 欧美在线观看在线观看| 欧美在线观看日本一区| 妖精视频一区二区三区免费观看| 妺妺窝人体色www在线小说| 99r精品视频| 国产又粗又爽视频| 亚洲天堂久久av| 中文另类视频| 在线观看国产一区| 国产美女视频91| 国产在线综合网| 精品一区二区电影| 性欧美1819sex性高清| 视频一区视频二区视频| 久久99久久99| 九九热国产精品视频| 亚洲黄一区二区| 怡红院成人在线| 亚洲一区bb| 国产成人99久久亚洲综合精品| 国产对白videos麻豆高潮| 日韩精品极品视频| 黄色成人小视频| 毛片在线视频观看| 99久久久无码国产精品| 无码人妻丰满熟妇精品区| 日韩中文视频免费在线观看| 国产日韩欧美中文在线| 国产a级片网站| 中文字幕精品一区二区精品绿巨人 | 精品国产乱码久久| 综合日韩av| www亚洲国产| 99riav一区二区三区| 一级α片免费看刺激高潮视频| 九九久久久久久久久激情| 日韩欧美影院| 五月婷婷之婷婷| 婷婷成人综合网| 韩国av网站在线| 蜜桃精品久久久久久久免费影院| 久久99国产精品久久99| 欧美成人精品欧美一级乱黄| 在线a欧美视频| eeuss国产一区二区三区四区| 久久久久久三级| 国产精品网曝门| 午夜性色福利影院| 91久久国产精品| 亚洲女同同性videoxma| 欧美老熟妇一区二区三区| 一区二区国产精品视频| 97人人澡人人爽91综合色| 日日噜噜夜夜狠狠| 黄网动漫久久久|