日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK源码解析之java.util.Iterator和java.lang.Iterable

發布時間:2025/3/8 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK源码解析之java.util.Iterator和java.lang.Iterable 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Java中,我們可以對List集合進行如下幾種方式的遍歷:第一種就是普通的for循環,第二種為迭代器遍歷,第三種是for each循環。后面兩種方式涉及到Java中的iterator和iterable對象,接下來我們通過源碼來看看這兩個對象的區別以及如何在自定義類中實現for each循環。

一、Java.util.Iterator

Java.util.Iterator 接口描述的是以統一的方式對各種集合元素進行遍歷 / 迭代的工具,也稱“迭代器”。

迭代器( Iterator )模式,又叫做游標( Cursor )模式,是用于遍歷集合類的標準訪問方法。 GOF 給出的定義為:提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節。

package java.util; import java.util.function.Consumer;public interface Iterator<E> {//如果迭代具有更多的元素,則返回true boolean hasNext(); //返回迭代中的下一個元素 E next();//從底層集合中刪除此迭代器返回的最后一個元素 default void remove() {throw new UnsupportedOperationException("remove"); } //對每個剩余元素執行給定的操作,直到所有元素都被處理或動作引發異常 default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next()); } }

iterator通過hasNext(),next()兩個方法定義了對集合迭代訪問的方法,而具體的實現方式依賴于不同的實現類,具體的集合類實現Iterator接口中的方法以實現迭代。

二、java.lang.Iterable

Iterable是從jdk1.5就存在的接口,其實我們經常用到它的功能,就是for-each,要想使用for-each,就必須實現此接口

package java.lang;import java.util.Iterator; import java.util.Objects; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer;//實現此接口允許對象成為“for-each loop”語句的目標 public interface Iterable<T> { //返回類型為 T元素的迭代器。 since 1.5 Iterator<T> iterator(); //對迭代器中的所有的元素進行某項處理,直到所有的都被處理或者出現異常 since 1.8 default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);} } /*返回一個可分割的迭代器 since 1.8Spliterator,可分割的迭代器,是1.8退出的用于并行遍歷元素而設計的一個迭代器官方文檔說明默認的實現分割的能力比較差,推薦覆蓋默認實現。可以跟上面的Iterator功能區分;一個是順序遍歷,一個是并行遍歷 */ default Spliterator<T> spliterator() {return Spliterators.spliteratorUnknownSize(iterator(), 0); } }

在List中并沒有實現Iterator接口,而是實現的Iterable接口。觀察Iterable接口的源碼可以發現其只是返回了一個Iterator對象。

注意

  • 并不是實現了Iterable接口的類才能使用foreach遍歷,數組就沒有實現Iterable接口,數組使用foreach,反編譯后的代碼其實是通過for循環來完成這個遍歷的功能。
  • 1.8新增了兩個默認實現:一個是foreach,一個是Spliterator
  • foreach和Spliterator一個是順序遍歷元素,一個是并行遍歷元素
  • 三、迭代器原理

    java 集合類庫的迭代器跟其他類庫的迭代器在概念上有著重要的區別。比如:C++的標準模板庫的迭代器是根據數組索引建模的。如果給定這樣一個迭代器,就可以查看指定位置上的元素,就像是知道數組索引i,就可以查看數組元素a[i]一樣,不需要查找元素,就可以將迭代器向前移動一個位置。但是Java迭代器并不是如此。

    java迭代器查找操作和位置變更是緊密相連的,查找元素的唯一方式就是調用next,而在執行查找的同時,迭代器位置隨之向前移動,因此,應該將java迭代器 認為是位于兩個元素之間。當調用next時候,迭代器就越過下一個元素,并返回剛剛越過的那個元素的引用。

    總結

    以上是生活随笔為你收集整理的JDK源码解析之java.util.Iterator和java.lang.Iterable的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。