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對象。

注意

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

三、迭代器原理

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

1544952542193

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535646.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為了讓你的網頁能在更多的服務器上正常地顯示,還是加上“SET NAMES UTF8”吧

Repinted:http://blog.csdn.net/class1/archive/2006/12/30/1469298.aspx 為了讓你的網頁能在更多的服務器上正常地顯示&#xff0c;還是加上“SET NAMES UTF8”吧(可以根據你的喜歡選擇相應的編碼,如gb2312)&#xff0c;即使你現在沒有加上這句也能正常訪問。 先說MySQL的字…

WebLogic11g 安裝配置規范

目錄 1 文檔控制... 3 1.1 修改記錄... 3 1.2 分發者... 3 1.3 審閱記錄... 3 1.4 相關文檔... 3 2 安裝準備... 4 2.1 安裝前需要開發單位提供的信息... 4 2.2 本地磁盤空間配置規范... 4 2.3 版本要求規范... 4 2.4 weblogic部署配置規范... 5 2.4.1操作系統要求.…

JDK源碼解析之java.util.ListIterator

ListIterator是一個功能更加強大的迭代器接口, 它繼承于Iterator接口,只能用于各種List類型的訪問。可以通過調用listIterator()方法產生一個指向List開始處的ListIterator, 還可以調用listIterator(n)方法創建一個一開始就指向列表索引為n的元素處的ListIterator。 一、源碼解…

VsFTP出現500 OOPS: cannot change directory的解決辦法

cannot change directory:/home/*** ftp服務器連接失敗,錯誤提示:500 OOPS: cannot change directory:/home/*******500 OOPS: child died解決方法:在終端輸入命令&#xff1a;setsebool ftpd_disable_trans 1 service vsftpd restart就&#xff2f;&#xff2b;了&#xff01;…

Oracle的reman命令

list命令&#xff1a; list backupset summary 列出概要信息 list backupset by file list archivelog all 列出所有歸檔日志 list backupset tag 00列出標簽信息 list backupset 8 列出8號…

Ubuntu root賬號的使用

第一次安裝好Ubuntu后&#xff0c;root帳號不能用。在安裝期間創建的第一個用戶對系統有管理權&#xff0c;通過“sudo”能象root運行程序.使用時僅需它的普通用戶密碼。例如: sudo apt-get update  如果你希望像傳統 UNIX 樣式使用root帳號。你能通過輸入 sudo passwd root …

JDK源碼解析之Java.util.Collection

Collection是單例集合的頂層接口&#xff0c;它表示一組對象&#xff0c;這些對象也稱為Collection的元素&#xff0c;JDK 不提供此接口的任何直接實現&#xff0c;它提供更具體的子接口&#xff08;如Set和List&#xff09;實現 一、源碼解析 1、接口定義 public interface …

Vim 命令操作

vim命令操作命令模式dd 編輯模式 末行模式 1.地址定界&#xff1a; startpos,endpos #:特定的第#行&#xff0c;例如S即第5行;:當前行;$:最后一行; #,#:指定行范圃,左側起始行&#xff0…

JDK源碼解析之Java.util.Collections

java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化&#xff0c;就像一個工具類,服務于Java的Collection框架。 一、源碼解析 1、不可實例化 private Collections() {}Collections是util包中一個不可實例化的類。 2、優化參數 pri…

ubuntu下安裝jdk

安裝1.5 sudo apt-get install sun-java5-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 安裝1.6 sudo apt-get install sun-java6-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 轉載:http:/…

使用validate驗證數據庫

驗證數據備份集是不是可以用來做恢復和數據文件是否損壞、壞塊 三種方式&#xff1a; 1.validate validate database ;validate tablespace users; validate datafile 1; validate archivelog all validate datafile 1 block 10; validate backupset 28; db…

JDK源碼解析之java.util.AbstractCollection

AbstractCollection類提供了collection的實現類應該具有的基本方法&#xff0c;具有一定的普適性&#xff0c;可以從大局上了解collection實現類的主要功能。 java.util.AbstractCollection這個類提供了對接口Collection骨骼級的實現。 一、源碼解析 1、iterator():返回一個迭…

溝通linux與windows的wine

據Netcraft網站調查&#xff0c;現在互聯網上的主機有75&#xff05;以上采用Linux作為操作系統。作為服務器操作系統&#xff0c;Linux已經站穩了腳步&#xff0c;可是在桌面 操作系統上&#xff0c;還是微軟的“瘟到死”一支獨秀。這倒不是說Linux不好&#xff0c;很大原因我…

備份spfil、控制文件等

delete backup&#xff1b; delete backupset delete noprompt backup backup keep forver database 永久保存恢復目錄中支持此命令 show parameter control 備份spfile backup spfile backup current contrlfile configure controlfile autoback …

日常問題——阿里云服務器ssh經常一段時間就斷掉解決辦法

#vim /etc/ssh/sshd_config 找到下面兩行 #ClientAliveInterval 0 #ClientAliveCountMax 3 去掉注釋&#xff0c;改成 ClientAliveInterval 30 ClientAliveCountMax 86400 這兩行的意思分別是 1、客戶端每隔多少秒向服務發送一個心跳數據 2、客戶端多少秒沒有相應&#…

在Ubuntu 8.04 LTS(hardy)下安裝配置nginx和fastcgi方式的php

最近我們(瑞豪開源Xen VPS: http://www.RasHost.com)的一個客戶要求在他的Ubuntu 8.04 VPS上安裝一個高性能的nginx&#xff0c;下面是我的安裝記錄。 由于Ubuntu 804已經包含了nginx&#xff0c;所以根本不要編譯&#xff0c;安裝超簡單&#xff01; 在VPS上修改/etc/apt/so…

apt-get包管理詳解

apt-get使用source.list文件進行軟件包管理。如果您想了解關于如何編輯和更新source.list中的條目的信息&#xff0c;請參閱SourcesList“起初GNU/Linux系統中只有.tar.gz。用戶必須自己編譯他們想使用的每一個程序。在Debian出現之後&#xff0c;人們認為有必要在系統中添 加一…

awk命令

awk是一個強大的文本分析工具&#xff0c;相對于grep的查找&#xff0c;sed的編輯&#xff0c;awk在其對數據分析并生成報告時&#xff0c;顯得尤為強大。簡單來說awk就是把文件逐行的讀入&#xff0c;以空格為默認分隔符將每行切片&#xff0c;切開的部分再進行各種分析處理。…

ubuntu安裝字符集

sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN

正則表達式和grep

正則表達式(regular expression, RE)是一種字符模式&#xff0c;用于在查找過程中匹配指定的字符。 在大多數程序里&#xff0c;正則表達式都被置于兩個正斜杠之間;例如/lv[o0]e/就是由正斜杠界定的正則表達式&#xff0c;它將匹配被查找的行中任何位置出現的相同模式。在正則表…