Iterator(迭代器)遍历Collection集合元素
Iterator(迭代器)是一個接口,它的作用就是遍歷容器的所有元素,也是 Java 集合框架的成員,但它與 Collection 和 Map 系列的集合不一樣,Collection 和 Map 系列集合主要用于盛裝其他對象,而 Iterator 則主要用于遍歷(即迭代訪問)Collection 集合中的元素。
Iterator 接口隱藏了各種 Collection 實現類的底層細節,向應用程序提供了遍歷 Collection 集合元素的統一編程接口。Iterator 接口里定義了如下 4 個方法。
boolean hasNext():如果被迭代的集合元素還沒有被遍歷完,則返回 true。Object next():返回集合里的下一個元素。void remove():刪除集合里上一次 next 方法返回的元素。void forEachRemaining(Consumer action):這是 Java 8 為 Iterator 新增的默認方法,該方法可使用 Lambda 表達式來遍歷集合元素。通過 Iterator 接口來遍歷集合元素。
import java.util.Collection; import java.util.HashSet; import java.util.Iterator;public class IteratorTest {public static void main(String[] args) {// 創建一個集合Collection objs = new HashSet();objs.add("Java教程");objs.add("C語言教程");objs.add("python教程");// 調用forEach()方法遍歷集合// 獲取books集合對應的迭代器Iterator it = objs.iterator();while (it.hasNext()) {// it.next()方法返回的數據類型是Object類型,因此需要強制類型轉換String obj = (String) it.next();System.out.println(obj);if (obj.equals("百度C語言")) {// 從集合中刪除上一次next()方法返回的元素it.remove();}// 對book變量賦值,不會改變集合元素本身obj = "百度Python語言";}System.out.println(objs);} }從上面代碼中可以看出,Iterator 僅用于遍歷集合,如果需要創建 Iterator 對象,則必須有一個被迭代的集合。沒有集合的 Iterator 沒有存在的價值。
注意:Iterator 必須依附于 Collection 對象,若有一個 Iterator 對象,則必然有一個與之關聯的 Collection 對象。Iterator 提供了兩個方法來迭代訪問 Collection 集合里的元素,并可通過 remove() 方法來刪除集合中上一次 next() 方法返回的集合元素。
當使用 Iterator 迭代訪問 Collection 集合元素時,Collection 集合里的元素不能被改變,只有通過 Iterator 的 remove() 方法刪除上一次 next() 方法返回的集合元素才可以,否則將會引發“java.util.ConcurrentModificationException”異常。下面程序示范了這一點。
public class IteratorErrorTest {public static void main(String[] args) {// 創建一個集合Collection objs = new HashSet();objs.add("百度Java教程");objs.add("百度C語言教程");objs.add("百度C++教程");// 獲取books集合對應的迭代器Iterator it = objs.iterator();while (it.hasNext()) {String obj = (String) it.next();System.out.println(obj);if (obj.equals("百度C++教程")) {// 使用Iterator迭代過程中,不可修改集合元素,下面代碼引發異常objs.remove(obj);}}} }輸出結果為:
百度C++教程 Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(Unknown Source)at java.util.HashMap$KeyIterator.next(Unknown Source)at IteratorErrorTest.main(IteratorErrorTest.java:15)第 15 行代碼位于 Iterator 迭代塊內,也就是在 Iterator 迭代 Collection 集合過程中修改了 Collection 集合,所以程序將在運行時引發異常。
Iterator 迭代器采用的是快速失敗(fail-fast)機制,一旦在迭代過程中檢測到該集合已經被修改(通常是程序中的其他線程修改),程序立即引發 ConcurrentModificationException 異常,而不是顯示修改后的結果,這樣可以避免共享資源而引發的潛在問題。
快速失敗(fail-fast)機制,是 Java Collection 集合中的一種錯誤檢測機制。注意:上面程序如果改為刪除“百度C語言教程”字符串,則不會引發異常。對于 HashSet 以及后面的 ArrayList 等,迭代時刪除元素都會導致異常。只有在刪除集合中的某個特定元素時才不會拋出異常,這是由集合類的實現代碼決定的。
總結
以上是生活随笔為你收集整理的Iterator(迭代器)遍历Collection集合元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot 之 elasti
- 下一篇: C语言中的正负数及其输出