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

