关于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.mzph.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;找到了两个网站可以…