一家之言 姑妄言之 絮絮叨叨 不足為訓(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)類都支持Iterator
的remove()
移除操作算行。所以梧油,這個方法肯定是會由其部分實現(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
到此全部解析完畢(?_?)征绎。