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(); // 安全刪除,不會觸發(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() 會拋出 NoSuchElementException(無此元素異常),這是新手最容易犯的錯(cuò)誤。
遍歷過程中不能用集合的 remove () 方法如果在迭代器遍歷期間,直接調(diào)用 collection.remove()(而非 it.remove()),會觸發(fā) ConcurrentModificationException(并發(fā)修改異常)。因?yàn)榈鲿z測集合的 “修改次數(shù)”,一旦發(fā)現(xiàn)迭代器之外的修改,就會報(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(),會拋出 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ì)上是迭代器的語法糖,編譯器會自動(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)同樣不能在遍歷中直接修改集合(比如刪除元素),否則也會拋出 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(),遍歷中修改集合仍會報(bào)錯(cuò)。
到此這篇關(guān)于java中Collection迭代器的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java Collection迭代器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis動(dòng)態(tài)SQL之where標(biāo)簽用法說明
這篇文章主要介紹了Mybatis動(dòng)態(tài)SQL之where標(biāo)簽用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringSecurity中的表單認(rèn)證詳細(xì)解析
這篇文章主要介紹了SpringSecurity中的表單認(rèn)證詳細(xì)解析,在上一篇文章中,我們初步引入了?Spring?Security,并使用其默認(rèn)生效的?HTTP?基本認(rèn)證保護(hù)?URL?資源,在本篇文章中我們使用表單認(rèn)證來保護(hù)?URL?資源,需要的朋友可以參考下2023-12-12

