日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > Java > 正文

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

2020-03-24 18:00:38
字體:
來源:轉載
供稿:網友
java.util包中包含了一系列重要的集合類。本文將從分析源碼入手,深入研究一個集合類的內部結構,以及遍歷集合的迭代模式的源碼實現內幕。

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

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

集合類的根接口Collection

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

boolean add(Object c)

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

類似的還有:

boolean addAll(Collection c);
boolean remove(Object o);
boolean removeAll(Collection c);
boolean remainAll(Collection c);

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

String[] o = (String[])c.toArray(new String[0]);

得到的o實際類型是String[]。

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

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

用Iterator模式實現遍歷集合

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

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

for(int i=0; i
而訪問一個鏈表(LinkedList)又必須使用while循環:

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

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

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

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

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

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

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

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

html' target='_blank'>public interface Iterator {
boolean hasNext();
Object next();
void remove();
}

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

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

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

// Type是具體的類型,如String。
for(Type t : c) {
// 對t的操作...
}


每一種集合類返回的Iterator具體類型可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它們都實現了Iterator接口,因此,客戶端不關心到底是哪種Iterator,它只需要獲得這個Iterator接口即可,這就是面向對象的威力。
Iterator源碼剖析

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

private class Itr implements Iterator {
...
}

而iterator()方法的定義是:

public Iterator iterator() {
return new Itr();
}

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

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

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

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

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

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

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

public Object next() {
checkForComodification();
try {
Object next = get(cursor);
lastRet = cursor++;
return next;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}

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

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

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}

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

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

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

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

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

最后給個完整的示例:

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

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

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
久久视频www| 国产欧美久久久精品免费| 久久夜色精品国产噜噜亚洲av| 日本精品二区| 欧美日韩国产免费| eeuss一区| 中文字幕亚洲第一| 精品久久蜜桃| 国产91欧美| 亚洲热线99精品视频| 国产福利一区二区在线精品| 在线看欧美日韩| 日韩欧美一卡二卡| 亚洲成年人影院在线| 日韩欧美亚洲国产一区| 日韩不卡在线观看| 亚洲欧美视频一区二区三区| 欧美日韩高清不卡| 亚洲高清精品视频| wwwav91com| 精人妻一区二区三区| 亚洲中文字幕一区| 中文字幕精品在线| 日韩一级在线视频 | 亚洲小说春色综合另类网蜜桃| 欧美片网站免费| 亚洲福利一区二区三区| 日韩中文字幕| 99精品在线播放| 欧美日韩一级片在线观看| 午夜国产福利在线观看| 日韩亚洲欧美中文高清在线| 欧美三级日韩三级| 日韩精品福利一区二区三区| 91最新在线| 91一区二区| 91精品国产综合久久久久久 | 日韩免费精品| www.老鸭窝.com| 欧美日韩精品中文字幕| 国产一卡2卡3卡四卡网站| 欧美日韩中文字幕精品| 欧美一级手机免费观看片| 刘玥91精选国产在线观看| 最近中文字幕第一页| 欧美日韩综合在线| 国产视频97| 日韩欧美国产三级| 国产最顶级的黄色片在线免费观看| 国产偷国产偷亚洲清高网站| 久久久99免费| 日韩精品一二三四区| 一区二区视频国产| 欧美在线日韩在线| 国产小视频免费在线网址| 日韩欧美中文字幕一区| 91最新在线| 日韩国产欧美三级| 日韩av一区在线| 午夜一区二区三区视频| 国产1卡2卡三卡四卡网站| 日韩三级视频在线播放| 欧美日韩精品综合| 亚洲 欧美 精品| 久久夜色精品国产噜噜亚洲av| 欧美不卡一二三| 欧美日韩亚洲第一| 亚洲第一视频网站| 久久91精品视频| 国产劲爆久久| 精品亚洲成a人片在线观看| 国产欧美亚洲一区| 亚洲 欧美综合在线网络| 精品日韩视频在线观看| 中文在线不卡视频| 欧美日韩视频不卡| 久久人人88| 中文字幕日韩精品在线| 日韩欧美在线1卡| 日韩 欧美 中文| 欧美日本精品| 日韩中文字幕视频网| 日韩免费视频一区二区| 欧美日韩中文字幕在线视频| 日韩欧美在线网站| 国产一二三区精品视频| 婷婷综合福利| 欧美,日韩,国产在线| 中文字幕视频一区二区三区久| 国产一级粉嫩xxxx| 婷婷久久综合网| 欧美日韩国产综合久久| 91精品国产色综合久久不卡蜜臀 | 亚洲精品中文字幕乱码三区不卡| 精品无人国产偷自产在线| 国产三级视频在线| 亚亚洲欧洲精品| 中文亚洲免费| 国产亚洲二区| 精品视频国产| 中文字幕日韩在线观看| 婷婷精品进入| 亚洲国产欧美日韩在线| 欧美日韩中文字幕日韩欧美| 在线国产1区| 一级网站免费观看| 97最新国自产拍视频在线完整在线看| 日韩在线视频网| 日韩一级二级三级精品视频| 91九色在线播放| 国产不卡视频在线| 91精品久久久久久久久久入口| 黄色欧美日韩| 亚洲一卡二卡在线观看| 亚州黄色一级| 亚洲一区视频在线观看视频| 国产免费久久| 中文字幕国产欧美| 亚洲欧美99| 中文在线不卡视频| 久久视频在线免费观看| 国产在线观看91| 91精品国产高清| 欧美亚洲另类制服自拍| 国产伦精品免费视频| aaa欧美日韩| 亚洲二区自拍| 日本亚洲欧美| 日韩欧美中文字幕在线观看| 中文字幕精品在线播放| 亚洲 欧美 中文字幕| 天天综合天天| 日韩精品 欧美| 中文不卡在线| 日韩欧美亚洲区| 91日韩欧美| 日韩国产欧美三级| 欧美日韩国产在线观看| 中文字幕第一页在线播放| 日韩精品第一区| 午夜伦欧美伦电影理论片| 99久久精品国产亚洲| 日韩欧美一二三| 日韩在线 中文字幕| 国产不卡精品在线| 午夜国产视频| 91精品国产91久久久久| 国产日韩av一区二区| 亚洲综合日韩欧美| 欧美另类久久久品| 精品久久91| 高清中文字幕在线| 二区视频在线观看| www日韩在线观看| 精品三区视频| 欧美日韩综合高清一区二区| 欧美日韩高清在线一区| 精品亚洲国内自在自线福利| 91九色在线看| 91xxx在线观看| 国产一区精品| 国产小视频免费在线网址| 91精品国产91久久久久久久久| 7799精品视频天天看| 日韩欧美一卡二卡| 日韩久久精品网| 黄色片网站在线| 国产香蕉精品视频| 日韩一级在线视频| 国产绿帽一区二区三区| 999精品视频在线观看播放| 欧美一级日韩一级| 日韩亚洲欧美中文高清在线| 日韩一级在线免费观看| 亚洲a一级视频| 丰满少妇一区二区| 中文字幕在线看精品乱码| 美女黄a一级视频| 日韩黄色在线播放| 国产成人精品av久久| 一区二区高清视频| 人成免费在线视频| 国产69精品久久app免费版| 久草中文在线观看| 日韩三级精品| 欧美日韩三级一区| 在线中文字幕网站| 日韩精品第一区| 日韩av一区二区在线| 欧美日韩夫妻久久| 国产啊啊啊视频在线观看| 国产精品福利视频一区二区三区| 中文精品电影| 欧美中文字幕在线| 中文字幕在线官网| 亚洲电影中文字幕在线观看| 日韩美女中文字幕| 日韩在线高清| 欧美日韩在线看| 中文字幕 亚洲视频| 国产在线欧美| 精品亚洲永久免费| 日韩你懂的电影在线观看| 国产欧美日韩高清| 日韩精品一二三四区| 久久99久久99精品中文字幕 | 亚洲一区在线观看免费| 在线观看国产一级片| 日韩欧美在线综合| 日韩视频在线免费播放| 日韩精品欧美| 欧美在线中文字幕| 日韩免费电影网站| 国产中文在线视频| 91精品啪在线观看国产60岁 | 91久久在线| 国产三级精品网站| 欧美日韩视频在线| 精品视频www| 日韩高清不卡一区| 国产在线观看a| 国产又粗又猛又爽又黄91精品| 欧美在线日韩精品| 亚洲第一视频在线观看| 精品极品三级久久久久| 婷婷中文字幕一区三区| 日韩国产91| 91精品观看| 99热最新网址| 国产高清视频一区二区| 欧美三级精品| 日韩三级精品电影久久久| 日韩在线精品| 日韩中文字幕| 一区二区三区精品在线| 偷窥国产亚洲免费视频| 亚洲欧洲综合另类| 中文字幕精品www乱入免费视频| 国产资源在线观看入口av| 国产不卡在线| 精品久久91| 亚洲第一精品在线| www.久久久精品| 在线观看中文字幕一区| 国产91久久久久蜜臀青青天草二| 蜜桃视频中文字幕| 日韩高清不卡一区| 亚洲综合在线小说| 免费国产h视频在线观看86| 久精品在线观看| 亚洲人线精品午夜| 欧美日韩高清不卡| 国产羞羞视频在线播放| 91精品国产自产在线丝袜啪| 亚洲国产一区自拍| 欧美久久在线| 成年人黄国产| 欧美日韩国产在线| 免费在线播放av| 国产高清精品二区| 国产123在线| 日韩欧美一级二级三级久久久| 国产网站欧美日韩免费精品在线观看 | 欧美日韩中文字幕在线| 国产99对白在线播放| 激情五月综合| av免费观看国产| 伊人www22综合色| 欧美日韩综合在线观看| 日韩欧美国产综合| 一区二区视频在线观看免费的| 亚洲黄色www| 粉嫩喷白浆久久| 日韩一二三四区| 中文字幕久久精品| 亚洲女人天堂a在线播放| 日韩视频精品在线| 亚洲开心激情| 免费在线观看国产黄| 国产福利久久久| 亚洲成人7777| 在线欧美日韩精品| 欧美日韩色综合| 日韩午夜中文字幕| 国产黄色精品| www在线视频| 极品久久久久久| 精品久久在线观看| 日韩欧美不卡视频| 中文字幕在线国产| 久久精品99久久久久久久久 | 91精品国产手机| 精品亚洲国内自在自线福利| 日韩av不卡在线观看| 日韩精品a在线观看91| 国产高清一区| 久久精品国产成人一区二区三区| 亚洲成av人片一区二区密柚| 国产欧美自拍一区| 亚洲第一视频网站| 亚洲一区在线观看免费| 欧美日韩综合视频网址| 亚洲欧美99| 国产一级片网站| 精品中文在线| 亚洲欧洲日韩在线| 国产视频aaa| 激情婷婷亚洲| 亚洲成在线观看| 中文字幕 欧美日韩| 国产丝袜一区| 91久久精品国产| av免费不卡国产观看| 国产拍揄自揄精品视频麻豆| 日韩欧美国产免费| 国产极品嫩模在线视频一区| 国产欧美日韩视频在线| 欧美三级日本三级少妇99| 亚洲国产午夜精品| 精品视频1区2区3区| 欧美日韩国产黄色| 一区二区中文视频| 国产黄色在线网站| 欧美日韩性视频| 91精品在线观看国产 | 日韩中文字幕亚洲| 国产欧美一级| 中文字幕在线观看网址| 日韩精品丝袜在线| 久久中文免费视频| 欧美三级免费观看| 亚洲一级在线| 精人妻一区二区三区| 一区二区三区鲁丝不卡| 欧美日韩性视频一区二区三区| 国产欧美日韩不卡免费| 亚洲欧洲日韩精品在线| 亚洲成a人片在线www| 一区二区三区在线不卡| 中文亚洲免费| 在线观看av的网站| 二区视频在线观看| 久久综合久久综合九色| 日韩激情一区| 日本啊v在线| 在线观看国产福利视频| 久久永久免费视频| 天堂在线一区二区三区| 91精品久久久久久蜜臀| 精品视频久久| 精品久久久网| 日韩精品在线第一页| 九九九精品视频| 亚洲区中文字幕| 成人福利一区| 欧美日韩亚洲综合在线| 日本a口亚洲| 精品播放一区二区| 日韩精品视频在线观看网址 | 日本黄色一区二区三区| 国产三级精品网站| 久久精品国产91精品亚洲| www日韩在线观看| 在线视频不卡一区二区| 久久精品www| 影音先锋中文字幕在线观看| 欧美另类专区| 亚洲精品欧美二区三区中文字幕 | 91国内精品在线视频| 精品日韩视频| 国产在线视频一区二区| 91精品国产全国免费观看| 国产绿帽一区二区三区| 999在线视频| 一区二区三区鲁丝不卡| 欧美日韩在线国产| 国产一区日韩| 国产绿帽一区二区三区| 久久香蕉精品| 91精品国产91久久久久青草| 亚洲小说春色综合另类网蜜桃| 日韩精品视频免费在线观看| 日韩在线三区| 福利一区二区| 久久香蕉av| 色屁屁一区二区| 日韩国产在线观看一区| 99精品一级欧美片免费播放| 久久精品视频免费看| 国产在线不卡一区| 中文在线中文字幕| 国产99对白在线播放| 精品福利二区三区| 婷婷久久综合网| 91精品国产91久久久久青草| 中文亚洲免费| 91日韩欧美| 成人无遮挡免费网站视频在线观看 | 大香一本蕉伊线亚洲网| 91精品国产综合久久久久久漫画|