Java集合之Iterator迭代器實(shí)現(xiàn)代碼解析
一、什么是Iterator
??Iterator??(迭代器)是 Java 集合框架中用于遍歷集合元素的接口,它是一個"指針"或"游標(biāo)",用于逐個訪問集合中的元素,而無需關(guān)心集合的內(nèi)部結(jié)構(gòu)。
二、Iterator的核心方法
| 方法 | 作用 | 使用頻率 |
|---|---|---|
boolean hasNext() | 判斷是否還有下一個元素 | 高 |
E next() | 返回下一個元素并移動指針 | 高 |
void remove() | 刪除當(dāng)前元素(最近一次 next() 返回的元素) | 中 |
default void forEachRemaining(Consumer<? super E> action) | Java 8+,對剩余元素執(zhí)行操作 | 中 |
三、基本使用示例
遍歷 List
List<String> list = Arrays.asList("A", "B", "C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}四、Iterator的工作原理
Iterator 內(nèi)部維護(hù)一個指針(cursor),初始指向集合的第一個元素之前:
- 調(diào)用
hasNext()檢查是否還有元素 - 調(diào)用
next()返回當(dāng)前元素并移動指針 - 遍歷結(jié)束時
hasNext()返回 false
五、使用注意事項(xiàng)
1、避免并發(fā)修改異常
// 錯誤做法:直接使用集合的remove方法
for (String s : list) {
if (s.equals("B")) {
list.remove(s); // 會拋出ConcurrentModificationException
}
}
// 正確做法:使用Iterator的remove方法
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if ("B".equals(s)) {
iterator.remove(); // 安全刪除
}
}2、remove()必須在next()之后調(diào)用
必須先調(diào)用next()獲取元素,然后才能調(diào)用remove()刪除該元素。
3、一個next()對應(yīng)一個remove()
不能連續(xù)調(diào)用兩次remove(),每次調(diào)用next()后只能調(diào)用一次remove()。
六、Iterator vs增強(qiáng)for循環(huán)
| 對比項(xiàng) | Iterator | 增強(qiáng) for 循環(huán) |
|---|---|---|
| 語法 | 手動寫 while 循環(huán) | for (T t : collection) |
| 刪除元素 | 支持(用 iterator.remove()) | 不支持(會拋異常) |
| 靈活性 | 高(可控制流程) | 低(只用于遍歷) |
| 底層實(shí)現(xiàn) | 直接使用 Iterator | 編譯后轉(zhuǎn)換為 Iterator |
??選擇建議??:只需遍歷時用增強(qiáng) for,需要刪除元素時用 Iterator。
七、適用集合類型
Iterator 可用于所有實(shí)現(xiàn) Iterable 接口的集合:
- List(ArrayList, LinkedList)
- Set(HashSet, TreeSet)
- Queue
- Map 的
keySet()、values()、entrySet()
八、Java8+替代方案
1.forEach+Lambda
list.forEach(System.out::println);
2.Stream API
list.stream()
.filter(s -> !s.equals("B"))
.forEach(System.out::println);現(xiàn)代Java開發(fā)推薦使用這些更簡潔的函數(shù)式編程方式。
九、Iterator設(shè)計(jì)模式
Iterator是"迭代器模式"的經(jīng)典實(shí)現(xiàn),其核心思想是將遍歷邏輯與集合分離,降低耦合度,讓用戶無需了解集合內(nèi)部結(jié)構(gòu)。
十、總結(jié)
| 關(guān)鍵點(diǎn) | 說明 |
|---|---|
| ??作用?? | 遍歷集合元素 |
| ??核心方法?? | hasNext(), next(), remove() |
| ??刪除元素?? | 必須使用 iterator.remove() |
| ??并發(fā)修改?? | 直接調(diào)用集合的 remove/add 會拋異常 |
| ??增強(qiáng) for 底層?? | 基于 Iterator 實(shí)現(xiàn) |
| ??現(xiàn)代替代?? | forEach(), Stream API |
??口訣??:"遍歷用 foreach,刪除用 iterator"
Iterator 是 Java 集合框架的基礎(chǔ),理解其原理和正確使用方式對于Java開發(fā)者至關(guān)重要。
以上就是Java集合之Iterator迭代器實(shí)現(xiàn)代碼解析的詳細(xì)內(nèi)容,更多關(guān)于Java Iterator迭代器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中管理資源的引用隊(duì)列相關(guān)原理解析
這篇文章主要介紹了Java中管理資源的引用隊(duì)列相關(guān)原理解析,涉及到Java的垃圾回收機(jī)制方面的知識,需要的朋友可以參考下2015-12-12
Mybatis攔截器如何實(shí)現(xiàn)數(shù)據(jù)權(quán)限過濾
本文介紹了MyBatis攔截器的使用,通過實(shí)現(xiàn)Interceptor接口對SQL進(jìn)行處理,實(shí)現(xiàn)數(shù)據(jù)權(quán)限過濾功能,通過在本地線程變量中存儲數(shù)據(jù)權(quán)限相關(guān)信息,并在攔截器的intercept方法中進(jìn)行SQL增強(qiáng)處理2024-12-12
Java線程基本使用之如何實(shí)現(xiàn)Runnable接口
這篇文章主要介紹了Java線程基本使用之如何實(shí)現(xiàn)Runnable接口問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Springboot文件上傳出現(xiàn)找不到指定系統(tǒng)路徑的解決
這篇文章主要介紹了Springboot文件上傳出現(xiàn)找不到指定系統(tǒng)路徑的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Java文件處理之使用itextpdf實(shí)現(xiàn)excel轉(zhuǎn)pdf
在文件處理中,經(jīng)常有文件類型轉(zhuǎn)換的使用場景,本文主要介紹了如何使用poi以及itextpdf完成excel轉(zhuǎn)pdf的操作,需要的小伙伴可以參考一下2024-02-02
從基礎(chǔ)到實(shí)戰(zhàn)詳解SpringBoot獲取資源文件全指南
在 SpringBoot 開發(fā)中,我們經(jīng)常需要訪問各類資源文件,本文將系統(tǒng)講解 SpringBoot 中資源文件的存放規(guī)則,獲取方法及實(shí)戰(zhàn)技巧,需要的可以了解下2025-07-07
maven自動將源碼打包并發(fā)布的實(shí)現(xiàn)步驟
maven-source-plugin 提供項(xiàng)目自動將源碼打包并發(fā)布的功能,在需要發(fā)布源碼項(xiàng)目的 pom.xml 文件中添加即可,本文就來介紹一下如何設(shè)置,感興趣的可以了解一下2023-11-11
spring?boot教程之IDEA環(huán)境下的熱加載與熱部署
這篇文章主要介紹了spring?boot系列教程中的IDEA環(huán)境下的熱加載與熱部署的相關(guān)資料,需要的朋友可以參考下2022-09-09
Java多線程讀寫鎖ReentrantReadWriteLock類詳解
本文詳細(xì)講解了Java多線程讀寫鎖ReentrantReadWriteLock類,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

