Java iterator常見(jiàn)用法
在 Java 中,Iterator
是一種用于遍歷集合(如 List
、Set
)的通用工具。它提供了一種統(tǒng)一的方式來(lái)訪問(wèn)集合中的元素,同時(shí)隱藏了集合的具體實(shí)現(xiàn)。
以下是對(duì) Java Iterator
的詳解,包括其作用、常見(jiàn)用法、實(shí)現(xiàn)原理和注意事項(xiàng)。
1. Iterator 的作用
- 提供一種通用的方式來(lái)遍歷集合,而無(wú)需了解集合的內(nèi)部實(shí)現(xiàn)。
- 支持安全地在遍歷過(guò)程中刪除集合中的元素(通過(guò)
remove()
方法)。 - 替代傳統(tǒng)的索引遍歷方式,避免代碼與集合實(shí)現(xiàn)耦合。
2. Iterator 的常見(jiàn)方法
Iterator
接口定義在 java.util
包中,主要包含以下方法:
方法簽名 | 描述 |
---|---|
boolean hasNext() | 判斷集合中是否還有未訪問(wèn)的元素。 |
E next() | 返回集合中的下一個(gè)元素。 |
void remove() | 刪除上次調(diào)用 next() 返回的元素(可選操作)。 |
3. 使用 Iterator 的步驟
示例代碼
import java.util.*; public class IteratorExample { public static void main(String[] args) { List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D")); // 獲取 Iterator 對(duì)象 Iterator<String> iterator = list.iterator(); // 遍歷集合 while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); // 刪除元素示例 if ("B".equals(element)) { iterator.remove(); // 刪除元素 "B" } } System.out.println("After removal: " + list); } }
輸出:
A
B
C
D
After removal: [A, C, D]
4. Iterator 的實(shí)現(xiàn)原理
4.1 集合和 Iterator 的關(guān)系
- 每個(gè)集合類(lèi)(如
ArrayList
、HashSet
)都有自己的Iterator
實(shí)現(xiàn)。 - 調(diào)用
iterator()
方法時(shí),集合會(huì)返回其內(nèi)部定義的Iterator
對(duì)象。
4.2 內(nèi)部維護(hù)的游標(biāo)
Iterator
內(nèi)部維護(hù)一個(gè)游標(biāo)(指針),指向當(dāng)前遍歷的位置。- 調(diào)用
next()
時(shí),游標(biāo)移動(dòng)到下一個(gè)位置并返回對(duì)應(yīng)的元素。 - 調(diào)用
remove()
時(shí),刪除游標(biāo)所指向的元素。
5. 增強(qiáng)的遍歷方式:for-each 循環(huán)
5.1 背景
for-each
循環(huán)是 Java 的語(yǔ)法糖,本質(zhì)上依賴于集合的Iterator
。- 適合只讀遍歷,不支持在遍歷時(shí)修改集合。
代碼示例
import java.util.*; public class ForEachExample { public static void main(String[] args) { List<String> list = Arrays.asList("A", "B", "C", "D"); for (String element : list) { System.out.println(element); } } }
局限性
for-each
無(wú)法直接調(diào)用Iterator.remove()
。- 適用于只讀遍歷,不適合需要?jiǎng)討B(tài)修改集合的場(chǎng)景。
6. Iterator 的變種
6.1 ListIterator
- 專用于
List
類(lèi)型的集合,繼承自Iterator
,提供了雙向遍歷和插入操作。 - 常用方法:
boolean hasPrevious()
:判斷是否有前一個(gè)元素。E previous()
:返回前一個(gè)元素。void add(E e)
:在當(dāng)前游標(biāo)位置插入元素。
示例代碼
import java.util.*; public class ListIteratorExample { public static void main(String[] args) { List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C")); ListIterator<String> listIterator = list.listIterator(); // 正向遍歷 while (listIterator.hasNext()) { System.out.println("Next: " + listIterator.next()); } // 反向遍歷 while (listIterator.hasPrevious()) { System.out.println("Previous: " + listIterator.previous()); } } }
輸出:
Next: A
Next: B
Next: C
Previous: C
Previous: B
Previous: A
6.2 Spliterator
Spliterator
是 Java 8 引入的新特性,專為支持并行遍歷而設(shè)計(jì)。- 提供了分割操作(
trySplit()
),允許將集合分成多個(gè)部分,便于多線程處理。
示例代碼
import java.util.*; public class SpliteratorExample { public static void main(String[] args) { List<String> list = Arrays.asList("A", "B", "C", "D"); Spliterator<String> spliterator = list.spliterator(); // 遍歷 Spliterator spliterator.forEachRemaining(System.out::println); } }
7. 注意事項(xiàng)
7.1 修改集合時(shí)的并發(fā)問(wèn)題
- 如果在一個(gè)線程中使用
Iterator
遍歷集合,同時(shí)另一個(gè)線程修改了集合,可能拋出ConcurrentModificationException
。 - 解決方案:
- 使用并發(fā)集合(如
CopyOnWriteArrayList
、ConcurrentHashMap
)。 - 使用顯式同步(如
synchronized
)。
- 使用并發(fā)集合(如
7.2 遍歷時(shí)刪除元素
- 必須使用
Iterator.remove()
方法刪除當(dāng)前元素,直接調(diào)用集合的remove()
方法會(huì)拋出ConcurrentModificationException
。 - 錯(cuò)誤示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C")); for (String element : list) { if ("B".equals(element)) { list.remove(element); // 錯(cuò)誤:拋出 ConcurrentModificationException } }
正確示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C")); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { if ("B".equals(iterator.next())) { iterator.remove(); // 正確 } }
8. 常見(jiàn)問(wèn)題與解答
Q1: 為什么使用 Iterator
?
- 隱藏集合的具體實(shí)現(xiàn),統(tǒng)一遍歷方式。
- 提供安全的遍歷和刪除功能。
Q2: 什么是 ConcurrentModificationException
?
- 當(dāng)
Iterator
遍歷過(guò)程中,集合被結(jié)構(gòu)性修改(如添加或刪除元素)時(shí),會(huì)拋出該異常。 - 解決方案:
- 使用
Iterator.remove()
。 - 使用并發(fā)集合。
- 使用
Q3: Iterator
和 ListIterator
的區(qū)別?
Iterator
適用于所有集合,支持單向遍歷。ListIterator
專用于List
,支持雙向遍歷和插入操作。
9. 總結(jié)
Iterator
是 Java 集合框架中最常用的遍歷工具,適用于所有集合類(lèi)型。它提供了簡(jiǎn)單、安全的遍歷方式,同時(shí)支持動(dòng)態(tài)刪除操作。在現(xiàn)代開(kāi)發(fā)中,for-each
和 Stream
逐漸成為主流,但 Iterator
仍然是不可或缺的基礎(chǔ)工具。
到此這篇關(guān)于Java iterator常見(jiàn)用法的文章就介紹到這了,更多相關(guān)Java iterator內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Springboot 優(yōu)雅停止服務(wù)的幾種方法
這篇文章主要介紹了詳解Springboot 優(yōu)雅停止服務(wù)的幾種方法 ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Java模擬實(shí)現(xiàn)HashMap算法流程詳解
在java開(kāi)發(fā)中,HashMap是最常用、最常見(jiàn)的集合容器類(lèi)之一,文中通過(guò)示例代碼介紹HashMap為啥要二次Hash,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02Spring Boot 整合單機(jī)websocket的步驟 附github源碼
websocket 是一個(gè)通信協(xié)議,通過(guò)單個(gè) TCP 連接提供全雙工通信,這篇文章主要介紹了Spring Boot 整合單機(jī)websocket的步驟(附github源碼),需要的朋友可以參考下2021-10-10Spring?Boot?整合?Fisco?Bcos的案例分析(區(qū)塊鏈)
本篇文章介紹的?Spring?Boot?整合?Fisco?Bcos的案例,是在阿里云服務(wù)器上部署驗(yàn)證的。大家可根據(jù)自己的電腦環(huán)境,對(duì)比該案例進(jìn)行開(kāi)發(fā)即可,具體案例代碼跟隨小編一起看看吧2022-01-01淺談常用字符串與集合類(lèi)轉(zhuǎn)換的工具類(lèi)
下面小編就為大家?guī)?lái)一篇淺談常用字符串與集合類(lèi)轉(zhuǎn)換的工具類(lèi)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08SpringBoot?@Value與@ConfigurationProperties二者有哪些區(qū)別
這篇文章主要介紹了SpringBoot?@Value與@ConfigurationProperties二者的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10