java中Collection迭代器的實現(xiàn)
一、迭代器(Iterator)是什么?
Iterator 是 Java 集合框架中專門用于遍歷 Collection 集合元素的接口(位于 java.util 包下),它為所有實現(xiàn) Collection 接口的集合(如 ArrayList、HashSet 等)提供了統(tǒng)一的遍歷方式。
你可以把迭代器理解為一個 “集合的專屬遍歷工具”:它就像一個指針,一開始指向集合第一個元素的 “前面”,通過調(diào)用方法可以逐個移動指針、獲取元素,而且能安全地在遍歷過程中刪除元素(這是普通 for 循環(huán)做不到的)。
二、Iterator 的核心方法
Iterator 接口只有 3 個核心方法,簡單且易記:
| 方法 | 作用 |
|---|---|
| boolean hasNext() | 判斷當前指針后面是否還有元素,有則返回 true,無則返回 false |
| E next() | ① 將指針向后移動一位 ② 返回當前指針指向的元素 |
| void remove() | 刪除上一次調(diào)用 next () 時返回的元素(遍歷中安全刪除元素的關鍵) |
三、Iterator 的基本使用步驟(核心)
使用迭代器遍歷 Collection 集合的固定步驟:
- 通過 Collection 的 iterator() 方法獲取迭代器對象;
- 用 hasNext() 判斷是否還有下一個元素;
- 用 next() 獲取下一個元素;
- (可選)用 remove() 刪除當前元素。
完整使用示例
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
// 1. 創(chuàng)建集合并添加元素
Collection<String> list = new ArrayList<>();
list.add("蘋果");
list.add("香蕉");
list.add("橙子");
list.add("葡萄");
// 2. 獲取迭代器對象
Iterator<String> it = list.iterator();
// 3. 遍歷集合
System.out.println("遍歷并輸出所有元素:");
while (it.hasNext()) { // 判斷是否有下一個元素
String fruit = it.next(); // 移動指針并獲取元素
System.out.println(fruit);
// 4. 可選:遍歷中刪除指定元素(比如刪除"香蕉")
if ("香蕉".equals(fruit)) {
it.remove(); // 安全刪除,不會觸發(fā)并發(fā)修改異常
}
}
// 遍歷結束后查看集合
System.out.println("\n刪除香蕉后的集合:" + list); // 輸出:[蘋果, 橙子, 葡萄]
}
}四、迭代器的關鍵注意事項(避坑重點)
調(diào)用 next () 前必須先調(diào)用 hasNext ()如果指針已經(jīng)到集合末尾,直接調(diào)用 next() 會拋出 NoSuchElementException(無此元素異常),這是新手最容易犯的錯誤。
遍歷過程中不能用集合的 remove () 方法如果在迭代器遍歷期間,直接調(diào)用 collection.remove()(而非 it.remove()),會觸發(fā) ConcurrentModificationException(并發(fā)修改異常)。因為迭代器會檢測集合的 “修改次數(shù)”,一旦發(fā)現(xiàn)迭代器之外的修改,就會報錯。
// 錯誤示例:遍歷中直接用集合的 remove 方法
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String fruit = it.next();
if ("香蕉".equals(fruit)) {
list.remove(fruit); // 拋出 ConcurrentModificationException
}
}remove () 必須在 next () 之后調(diào)用如果先調(diào)用 it.remove() 再調(diào)用 it.next(),或者連續(xù)調(diào)用兩次 it.remove(),會拋出 IllegalStateException(非法狀態(tài)異常)。因為 remove() 只能刪除 “上一次 next () 獲取的元素”,沒有 next () 就沒有可刪除的元素。
迭代器遍歷是單向的迭代器只能從前往后遍歷,一旦遍歷到末尾,無法回頭重新遍歷,除非重新獲取一個新的迭代器對象。
五、增強 for 循環(huán)(foreach)與迭代器的關系
你平時用的增強 for 循環(huán)(for (元素類型 變量 : 集合))本質(zhì)上是迭代器的語法糖,編譯器會自動將其編譯為迭代器遍歷的代碼。比如:
// 增強 for 循環(huán)遍歷
for (String fruit : list) {
System.out.println(fruit);
}
// 編譯器編譯后等價于:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String fruit = it.next();
System.out.println(fruit);
}?? 注意:增強 for 循環(huán)同樣不能在遍歷中直接修改集合(比如刪除元素),否則也會拋出 ConcurrentModificationException。
總結
Iterator是遍歷Collection集合的標準工具,提供hasNext()、next()、remove()三個核心方法,保證遍歷的統(tǒng)一性和安全性。- 迭代器使用的核心規(guī)則:先
hasNext()判斷,再next()獲取,遍歷中刪除元素必須用it.remove()而非集合的remove()。 - 增強 for 循環(huán)是迭代器的語法糖,本質(zhì)相同,但無法手動調(diào)用
remove(),遍歷中修改集合仍會報錯。
到此這篇關于java中Collection迭代器的實現(xiàn)的文章就介紹到這了,更多相關java Collection迭代器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaWeb中Tomcat底層機制和Servlet運行原理詳解
這篇文章主要介紹了JavaWeb中Tomcat底層機制和Servlet運行原理詳解,Tomcat是一個開源的Java Web服務器,它是基于Java Servlet和JavaServer Pages(JSP)技術的,下面是關于Tomcat底層機制和Servlet運行原理的簡要說明,需要的朋友可以參考下2023-10-10
@PathVariable獲取路徑中帶有 / 斜杠的解決方案
這篇文章主要介紹了@PathVariable獲取路徑中帶有 / 斜杠的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

