關于Iterator 和ListIterator的詳解

1.Iterator

Iterator的定義如下:

public interface Iterator<E> {}

Iterator是一個接口,它是集合的迭代器。集合可以通過Iterator去遍歷集合中的元素。Iterator提供的API接口如下:

img

  • forEachRemaining(Consumer<? super E> action):為每個剩余元素執行給定的操作,直到所有的元素都已經被處理或行動將拋出一個異常

  • hasNext():如果迭代器中還有元素,則返回true

  • next():返回迭代器中的下一個元素

  • remove():從迭代器指向的collection中移除迭代器返回的最后一個元素(可選操作).

注意:如果迭代刪除每一個元素,就必須使用迭代器方式進行刪除;,否則會出現ConcurrentModificationException - 并發修改異常

2.迭代器如何使用

2.1 迭代器正常遍歷集合
public class demo {public static void main(String[ ] args) {ArrayList<Integer> arr=new ArrayList<>();arr.add(10);arr.add(20);arr.add(30);arr.add(40);arr.add(50);Iterator<Integer> it=arr.iterator();while (it.hasNext()){system.out.print(it.next()+"");}}
}

結果:

10 20 30 40 50
2.2 完全版迭代器可以一邊遍歷一邊刪除元素
public class demo {public static void main(String[ ] args){ArrayList<Integer> arr=new ArrayList<>();arr.add(10);arr.add(20);arr.add(30);arr.add(40);arr.add(50);system.out.println("Before iterate : " +arr);Iterator<Integer> it=arr.iterator();while (it.hasNext()){System.out.print(it.next()+"");it.remove();}system.out.println();//換行system.out.println(arr);}
}

結果如下:

Before iterate :[10,20,30,40,50]
10 20 30 40 50
[]

注意:

(1)Iterator只能單向移動。

(2)Iterator.remove()是唯一安全的方式來在迭代過程中修改集合;如果在迭代過程中以任何其它的方式修改了基本集合將會產生未知的行為。而且每調用一次next()方法,remove()方法只能被調用一次,如果違反這個規則將拋出一個異常。

2.3 foreach循環刪除元素則會報錯
public class demo {public static void main(String[] args) {ArrayList<Integer> arr=new ArrayList<>();arr.add(10);arr.add(20);arr.add(30);arr.add(40);arr.add(50);for (Integer integer : arr) {system.out.print(integer);arr.remove(integer);}}
} 

在這里插入圖片描述

for-each循環不支持集合在迭代過程中的結構性修改(如添加或刪除元素)

使用迭代器Iterator)顯式地刪除元素:

Iterator<Integer> iterator = arr.iterator(); ?
while (iterator.hasNext()) { ?iterator.next(); // 移動到下一個元素 ?iterator.remove(); // 刪除當前元素 ?
}

普通for循環remove(int index)方法可以刪除元素,但是索引值會改變。

for (int i = arr.size() - 1; i >= 0; i--) { ?arr.remove(i); ?
}
總結:

????????迭代器僅僅是遍歷輸出語句!本身并沒有任何排序等其他功能,在數據結構的二叉樹中別認為迭代器輸出二叉樹是因為迭代器會排序,是因為排序二叉樹本身有序,迭代器僅僅是按照排序二叉樹本身的排序規則輸出罷了。

3. ListIterator

ListIterator是一個功能更加強大的, 它繼承于Iterator接口,只能用于各種List類型的訪問---專門為 List 集合設計

可以通過調用 listIterator() 方法產生一個指向List開始處的ListIterator, 還可以調用listIterator(n)方法創建一個一開始就指向列表索引為n的元素處的ListIterator。

我們先來看一段關于ListIterator的描述:

img

ListIterator接口定義如下:

Interface ListIterator<E>{}

包含的方法有:

img

ListIterator 的主要方法包括:

  • boolean hasNext(): 檢查列表中是否還有下一個元素。

  • E next(): 返回列表中的下一個元素,并將迭代器位置向前移動一位。

  • boolean hasPrevious(): 檢查列表中是否還有上一個元素。

  • E previous(): 返回列表中的上一個元素,并將迭代器位置向后移動一位。

  • int nextIndex(): 返回對下一個元素的索引(正向迭代中的索引)。

  • int previousIndex(): 返回對上一個元素的索引(反向迭代中的索引)。

  • void add(E e): 在迭代器的當前位置插入指定的元素(可選操作)。

  • void set(E e): 用指定的元素替換迭代器最后返回的元素(可選操作)。

  • void remove(): 從列表中移除迭代器最后返回的元素(可選操作)。

由以上定義我們可以推出ListIterator可以:

(1)雙向移動(向前/向后遍歷)。

(2)產生相對于迭代器在列表中指向的當前位置的前一個或后一個元素的索引。

(3)可以使用set()方法替換它訪問過的最后一個元素。

(4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一個元素.

例子:

import java.util.*;
public class TestListIterator{public static void main(String[] args) {ArrayList<String> a = new ArrayList<String>();a.add("aaa");a.add("bbb");a.add("ccc");System.out.println("Before iterate : " + a);ListIterator<String> it = a.listIterator()while (it.hasNext()) {System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());}while (it.hasPrevious()) {System.out.print(it.previous() + " ");//ccc bbb aaa}System.out.println();it = a.listIterator(1);//調用listIterator(n)方法創建一個一開始就指向列表索引為n的元素處的ListIterator。while (it.hasNext()) {String t = it.next();System.out.println(t);if ("ccc".equals(t)) {it.set("nnn");} else {it.add("kkk");}}System.out.println("After iterate : " + a);}
}
Before iterate : [aaa, bbb,ccc]
aaa,0,1
bbb,1,2
ccc,2,3
ccc bbb aaa
bbb
ccc
After iterate : [aaa,bbb,kkk, nnn]

Iterator和ListIterator區別 我們在使用List,Set的時候,為了實現對其數據的遍歷,我們經常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍歷的過程,只需要每次取出一個你想要的數據進行處理就可以了。但是在使用的時候也是有不同的。List和Set都有iterator()來取得其迭代器。對List來說,你也可以通過listIterator()取得其迭代器,兩種迭代器在有些時候是不能通用的,Iterator和ListIterator主要區別在以下方面:

  • ListIterator有add()方法,可以向List中添加對象,而Iterator不能

  • ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。

  • ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。

  • 都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。

    因為ListIterator的這些功能,可以實現對LinkedList等List數據結構的操作。其實,數組對象也可以用迭代器來實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16292.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VS2022通過C++網絡庫Boost.Asio創建一個簡單的同步TCP服務器和客戶端

Boost.Asio是一個用于網絡和異步編程的C庫。它提供了一種跨平臺的方式來處理網絡編程和異步操作&#xff0c;使開發人員能夠創建高性能的網絡應用程序&#xff0c;asio幾乎支持所有你能夠想到的網絡協議&#xff0c;比如tcp、udp、ip、http、icmp等&#xff0c;C通過asio庫可以…

找出第 K 大的異或坐標值

問題 給你一個二維矩陣 matrix 和一個整數 k &#xff0c;矩陣大小為 m x n 由非負整數組成。 矩陣中坐標 (a, b) 的 值 可由對所有滿足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下標從 0 開始計數&#xff09;執行異或運算得到。…

淺談網絡通信(1)

文章目錄 一、認識一些網絡基礎概念1.1、ip地址1.2、端口號1.3、協議1.4、協議分層1.5、協議分層的2種方式1.5.1、OSI七層模型1.5.2、TCP/IP五層模型[!]1.5.2.1、TCP/IP五層協議各層的含義及功能 二、網絡中數據傳輸的基本流程——封裝、分用2.1、封裝2.2、分用2.2.1、5元組 三…

基于大模型和RAG技術實現的開源項目

基于大模型和RAG技術實現的開源項目 為解決大模型的不足&#xff0c;使用RAG技術增強大模型生成內容的針對性和可讀性能力&#xff0c;有很多不錯的開源項目。例如下面的項目。 1 ragflow 優點&#xff1a;可以對文檔和知識庫進行管理&#xff0c;構建不同的知識庫&#xff…

python冰雹序列的探索與編程實現

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、冰雹序列的奧秘 二、編程實現冰雹序列 三、測試與驗證 四、總結與展望 一、冰雹序列的…

整理好了!2024年最常見 20 道 Redis面試題(八)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常見 20 道 Redis面試題&#xff08;七&#xff09;-CSDN博客 十五、Redis 的性能調優有哪些方法&#xff1f; Redis的性能調優是一個多方面的工作&#xff0c;涉及到硬件、配置、代碼層面的優化等多個方面。以下是一些常…

openEuler 22.03 LTS SP3源碼編譯部署OpenStack-Caracal

openEuler 22.03 LTS SP3源碼編譯部署OpenStack-Caracal 說明機器詳情安裝操作系統注意事項基礎準備Controller節點 && Compute節點 && Block節點關閉防火墻關閉selinux設置靜態IP更新安裝前準備Controller節點 && Compute節點 && Block節點設…

第十課,while循環

一&#xff0c;認識循環是什么 循環普遍存在于日常生活中&#xff0c;同樣&#xff0c;在程序中&#xff0c;循環功能也是至關重要的基礎功能。 當程序需要重復執行某一段代碼&#xff0c;利用循環可以輕松完成工作 例如我要你打印100次上課&#xff0c;直接寫100次print&…

python調用阿里云通義千問(q-wen-max)API-只能總結pdf文檔內容

文章目錄 通義千問插件PDF解析插件調用案例通義千問插件 Dashscope插件功能能夠使得大模型的生成內容與外部三方應用結合,使得模型生成的內容更加準確和豐富,模型將擁有更好的生成能力。您也可以通過開發自定義插件,來使得模型生成更符合您預期的結果。 使用插件功能,大模…

電子閱覽室在管理時需注意什么

關于如今的絕大多數人來說&#xff0c;想必都聽說過“電子閱覽室”這一概念。它首要運用在校園中&#xff0c;給學生們供給愈加豐厚的常識儲藏。它也是一個獨立的局域網&#xff0c;在校園網絡中作為重要的一個組成部分而存在。但是&#xff0c;一個好的電子閱覽室是需求滿意運…

LORA學習筆記3——訓練參數

訓練步長 Step&#xff08;步&#xff09;:模型訓練時ai模型會根據標注生成一個圖片&#xff0c;并與學習圖片進行對比&#xff0c;通過對比的結果調整嵌入向量。這樣的一個流程就被稱為“一步”。 如果一個訓練集中有50張圖片&#xff0c;每張圖片設定為要訓練10次&#xff…

CCF20231201——倉庫規劃

CCF20231201——倉庫規劃 代碼如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,m,a[1001][11],b[1001]{0};cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j)cin>>a[i][j];}for(int i1;i<n;i){bool foundfals…

設計模式在芯片驗證中的應用——模板方法

一、模板方法 模板方法(Template Method)設計模式是一種行為設計模式&#xff0c; 它在父類中定義了一個功能的框架&#xff0c; 允許子類在不修改結構的情況下重寫功能的特定步驟。也就是模板方法定義了一組有序執行的操作&#xff0c;將一些步驟的實現留給子類&#xff0c;同…

把自己的垃圾代碼發布到官方中央倉庫

參考博客&#xff1a;將組件發布到maven中央倉庫-CSDN博客 感謝這位博主。但是他的步驟有漏缺&#xff0c;相對進行補充 訪問管理頁面 網址&#xff1a;Maven Central 新注冊賬號&#xff0c;或者使用github快捷登錄&#xff0c;建議使用github快捷登錄 添加命名空間 注意&…

連接mysql的java代碼

要在Java中連接MySQL數據庫,你需要以下幾個步驟: 導入MySQL JDBC驅動:在項目中添加MySQL JDBC驅動的依賴。如果你使用的是Maven,可以在pom.xml中添加依賴;如果使用的是Gradle,可以在build.gradle中添加依賴;如果不使用構建工具,需要手動下載驅動并添加到項目中。 編寫J…

【Linux】進程通信實戰 —— 進程池項目

送給大家一句話: 沒有一顆星&#xff0c;會因為追求夢想而受傷&#xff0c;當你真心渴望某樣東西時&#xff0c;整個宇宙都會來幫忙。 – 保羅?戈埃羅 《牧羊少年奇幻之旅》 &#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;? &a…

flink cdc mysql整理與總結

文章目錄 一、業務中常見的需要數據同步的場景CDC是什么FlinkCDC是什么CDC原理為什么是FlinkCDC業務場景flink cdc對應flink的版本 二、模擬案例1.阿里云flink sql2.開源flink sql(單機模式)flink 安裝安裝mysql3.flink datastream 三、總結 提示&#xff1a;以下是本篇文章正文…

mac中文件夾怎么顯示.git隱藏文件

1. 打開終端應用程序&#xff0c;然后進入到包含.git文件夾的目錄&#xff0c;可以使用以下命令來顯示隱藏文件和文件夾&#xff1a; defaults write com.apple.finder AppleShowAllFiles YES 2. 然后重啟 Finder&#xff1a; killall Finder

kali基本掃描工具(自帶)

免責聲明:本文僅做技術交流與學習...請勿非法破壞... 詳細用法: 命令 -h/百度/翻譯 fping 用法 hostlist 文件里面為ip fping -a -q -f hostlist -a 只看存活的 fping -g 202.100.1.1 202.100.1.255 -a -q > Ahost 輸出到Ahost文件上 nping nping -c 1 201.100.2.155-244 …

工具方法 - 如何在網上找資料

在查詢USB相關的技術資料時&#xff0c;官網的文檔中心里找到個spec的記錄&#xff0c;但下載鏈接沒有。然后在Google上搜索&#xff1a; fileytpe:pdf my_keyword 只找到一個收費的文檔下載網站&#xff0c;這讓我不開心。 于是在Yandex上搜了下&#xff0c;找到了兩個網站可以…