Iterator源碼逐條解析

一家之言 姑妄言之 絮絮叨叨 不足為訓(xùn)

Iterator接口注釋翻譯:

?? 集合上的迭代器遵班。迭代器在Java集合框架中代替了枚舉焚挠。迭代器與枚舉有兩個不同之處:
?? 1.迭代器允許調(diào)用者使用定義良好的語義在迭代期間從基礎(chǔ)集合中刪除元素颊埃。
?? 2.方法名已經(jīng)得到了改進(jìn)披蕉。
?? 該接口是Java集合框架的成員贱纠。


筆者廢話:

?? 這里的Iterator譯為迭代器伊佃,那么對于我來說,其實這就是個循環(huán)對象而已焕毫。它作為一個接口蹲坷,也就是一個對象,其工作就是遍歷集合中的對象邑飒,當(dāng)然循签,這些集合對象需要去實現(xiàn)它。你可以理解它為for循環(huán)的變種疙咸,但是這里也僅僅表明“理解”而不是等同县匠。
?? 也只有實現(xiàn)了Iterator接口的對象才能調(diào)用其方法,這點是毋庸置疑的撒轮。所以乞旦,我們也可以理解為Iterator就是那些實現(xiàn)了它的集合本身所擁有的屬性,而這個屬性也規(guī)定了题山,我們的集合兰粉,是可以遍歷的。


Iterator接口信息:

public interface Iterator<E>

?? 我們可以清楚的看到臀蛛,Iterator是一個接口亲桦,而且這里還規(guī)定了泛型機制。而通過接口注釋來看浊仆,這個泛型E就是這個迭代器返回的元素的類型客峭。


Iterator接口方法信息:

/**
 * 如果該迭代器內(nèi)有更多的元素,則返回true抡柿。換句話說舔琅,如果next將返回
 * 一個元素而不是拋出一個異常,則返回true
 * @return 如果該迭代器內(nèi)有更多的元素洲劣,則為真
 */
boolean hasNext();

?? 這個方法意在詢問當(dāng)前遍歷的容器中是否含有下一個元素备蚓。這里會涉及到一個指針操作,當(dāng)然囱稽,我們java宣稱的可是沒有指針郊尝,所以,這我們可以把它稱之為“指向”战惊。一般來說流昏,如果我們使用了某個集合的Iterator對象后,會在這個集合的上方出現(xiàn)一個空值,而我們的Iterator對象就指向這個空值况凉。
?? 但是需要注意的是谚鄙,這個方法僅僅是詢問下一個元素是否存在,此時并不移動指向位置刁绒,只有調(diào)用了next()方法后闷营,這個指向位置才會進(jìn)行移動,即知市,移動到下一項傻盟。

/**
 * 返回迭代器中的下一個元素。
 * @return 返回迭代器中的下一個元素初狰。
 * @throws 如果迭代沒有更多的元素則拋出NoSuchElementException異常
 */
E next();

?? 這個方法是與hasNext()方法遙相呼應(yīng)的莫杈。它代表著返回迭代器中的下一個元素互例。一般來說奢入,我們都會通過hasNext()方法來判斷是否有下一個元素,一旦有媳叨,那么就調(diào)用next()方法展示(取出)這個元素腥光。
?? 重復(fù)上面的一段話:調(diào)用了next()方法后,容器的指向位置會進(jìn)行移動糊秆,即武福,移動到下一項。

/**
 * 從基礎(chǔ)集合中移除此迭代器返回的最后一個元素(可選操作)痘番。此方法在每次
 * 調(diào)用next時只能調(diào)用一次捉片。如果在迭代過程中以調(diào)用此方法以外的任何方式
 * 修改了底層集合,則迭代器的行為是未指定的汞舱。
 * 
 * @implSpec
 * 默認(rèn)實現(xiàn)拋出UnsupportedOperationException異常伍纫,不執(zhí)行其他操作。
 * 
 * @throws 如果這個迭代器不支持刪除操作則拋出
 * UnsupportedOperationException異常
 * @throws 如果尚未next()方法昂芜,或者在最后一次調(diào)用next()方法之后已經(jīng)
 * 調(diào)用了remove方法則拋出IllegalStateException異常
 */
default void remove() {
    throw new UnsupportedOperationException("remove");
}

?? 這個移除方法其實挺有的說的莹规。
?? 首先,我們看它的修飾符泌神,是default良漱。這個default區(qū)別于我們類里面成員屬性的default。這個是JAVA 1.8給接口新添加的特性欢际。它表示我們可以在接口里面進(jìn)行方法的默認(rèn)實現(xiàn)母市。當(dāng)然,這個方法也可被其實現(xiàn)類進(jìn)行重寫
?? 其次损趋,這個方法刪除的是上一次調(diào)用了next()方法時返回的元素患久。所以,這個方法必須在調(diào)用next()方法之后才可調(diào)用,如果在next()方法之前調(diào)用將會拋出IllegalStateException異常墙杯。這塊不是絕對啊配并,這塊不是絕對啊,你試試ArrayList就行了高镐。試一下只添加一個元素就開始遍歷溉旋,試試啊小可愛~
?? 再次,我們從其代碼入手嫉髓,會發(fā)現(xiàn)它默認(rèn)拋出UnsupportedOperationException異常观腊。其本質(zhì)是告訴我們,不是所有的實現(xiàn)類都支持Iteratorremove()移除操作算行。所以梧油,這個方法肯定是會由其部分實現(xiàn)類進(jìn)行重新覆寫,而不是僅僅提供一個無用的方法州邢。
?? 這里就不再舉例了儡陨,因為本身這就是一個接口,其各自的實現(xiàn)類都幾乎重寫了這個方法量淌,所以這里即使舉例也是利用其實現(xiàn)類骗村。并且,各自的實現(xiàn)還略有差別呀枢。因此胚股,大家可以移步我其他的集合源碼分析篇章來具體查看這些示例。

/**
 * 為每個剩余元素執(zhí)行給定的操作裙秋,直到處理完所有元素或操作引發(fā)異常琅拌。
 * 如果指定了迭代的順序,則按照迭代的順序執(zhí)行操作摘刑。操作引發(fā)的異常將
 * 被轉(zhuǎn)發(fā)給調(diào)用者进宝。
 * 
 * @implSpec
 * 默認(rèn)實現(xiàn)的行為就像:
 *  while (hasNext())
         action.accept(next());
         
 * @param action The action to be performed for each element
 * @throws NullPointerException if the specified action is null
 * @since 1.8
 */
default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
        action.accept(next());
}

?? 這里是Iterator接口中最后一個方法,它也是JAVA1.8新定義的一個方法泣侮。需要注意的是它也是一個被default修飾符修飾的方法即彪,即,它也是這個接口多定義具有默認(rèn)實現(xiàn)的方法活尊。
?? 從方法名來看隶校,它就是一個遍歷方法,只不過它遍歷的是剩余元素蛹锰。那么從注釋上面來看深胳,也表明了該方法為每個剩余元素執(zhí)行給定的操作,直到處理完所有元素或操作引發(fā)異常铜犬。
?? 不過這里筆者需要表明的是舞终,這里所謂的“剩余”其實無所謂轻庆。我們從其代碼來看,它就是在遍歷元素敛劝,然后對遍歷出的元素做出某種操作余爆。當(dāng)然,這種操作我們還是需要具體到實現(xiàn)類的夸盟。
?? 當(dāng)然蛾方,根據(jù)我們文章的總意,還是需要講解一下其代碼的內(nèi)部實現(xiàn)上陕。
?? 首先我們可以看到其傳進(jìn)來的參數(shù)是一個Consumer<? super E>類桩砰,它是一個函數(shù)式編程接口。這個行為也表明了我們需要處理的元素必須是當(dāng)前Iterator泛型內(nèi)指定類型的子類释簿,或其本類亚隅。
?? 接下來的代碼會對其進(jìn)行一次非空判斷,只有通過判斷才可以進(jìn)行下一步操作庶溶。
?? 當(dāng)我們的參數(shù)通過了非空判斷之后煮纵,剩下的,就開始了while循環(huán)進(jìn)行遍歷渐尿。然后對其遍歷的元素進(jìn)行處理醉途。當(dāng)然,這種處理之前也說過了砖茸,是需要具體到實現(xiàn)類的。到底做了什么處理殴穴,不能從這里得知凉夯,而應(yīng)該去看其具體的實現(xiàn)方法
?? 這些具體的實現(xiàn)方法我會在其具體的實現(xiàn)類里面具體做介紹采幌,這里還是不摻雜那么多的解釋或舉例劲够。僅僅留給這個Iterator接口一個說一是一的解析吧。
?? 至此休傍,我們Iterator到此全部解析完畢(?_?)征绎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磨取,隨后出現(xiàn)的幾起案子人柿,更是在濱河造成了極大的恐慌,老刑警劉巖忙厌,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凫岖,死亡現(xiàn)場離奇詭異,居然都是意外死亡逢净,警方通過查閱死者的電腦和手機哥放,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門歼指,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甥雕,你說我怎么就攤上這事踩身。” “怎么了社露?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵惰赋,是天一觀的道長。 經(jīng)常有香客問我赁濒,道長,這世上最難降的妖魔是什么拒炎? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任挨务,我火速辦了婚禮击你,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谎柄。我一直安慰自己丁侄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布鸿摇。 她就那樣靜靜地躺著劈猿,像睡著了一般拙吉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揪荣,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天筷黔,我揣著相機與錄音,去河邊找鬼仗颈。 笑死,一個胖子當(dāng)著我的面吹牛挨决,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凰棉,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼福压!你這毒婦竟也來了掏秩?” 一聲冷哼從身側(cè)響起荆姆,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胆筒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仆救,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年摧莽,在試婚紗的時候發(fā)現(xiàn)自己被綠了顿痪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镊辕。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡征懈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卖哎,到底是詐尸還是另有隱情,我是刑警寧澤棉饶,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布镇匀,位于F島的核電站,受9級特大地震影響袜啃,放射性物質(zhì)發(fā)生泄漏汗侵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一晰韵、第九天 我趴在偏房一處隱蔽的房頂上張望熟妓。 院中可真熱鬧雪猪,春花似錦起愈、人聲如沸译仗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽休涤。三九已至,卻和暖如春功氨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捷凄。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纵势,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓软舌,卻偏偏與公主長得像牛曹,于是被迫代替她去往敵國和親佛点。 傳聞我的和親對象是個殘疾皇子黎比,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348