关于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数据结构的操作。其实,数组对象也可以用迭代器来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio开发之路(十三)主题影响Button颜色问题解决及button自定义样式

一、问题描述 在开发过程中发现安卓的默认主题色是紫色&#xff0c;并且会导致button也是紫色&#xff0c;有时直接在xml布局文件中直接设置button的背景色或者设置背景图片不起效果 方案一、如果是app&#xff0c;可以直接设置主题颜色 比如&#xff0c;将主题设置为白色&a…

GNSS的经纬度使用float还是doubble数据类型存储传输?

1. 背景 当你在使用导航、打车、定位等等场景下&#xff0c;一定会有形或者无形的使用位置服务&#xff0c;位置服务的基础功能功能就是向你提供位置信息&#xff0c;而经纬度是位置信息的主要信息&#xff0c;一般情况可以简单的认为位置信息就是经纬度信息。经纬度使用小数进…

五分钟”手撕“异常

目录 一、什么是异常 二、异常的体系和分类 三、异常的处理 1.抛出异常 2.异常的捕获 异常声明throws&#xff1a; try-catch处理 四、finally finally一定会被执行吗&#xff1f; 五、throw和throws区别 六、异常处理的流程 七、自定义异常 一、什么是异常 顾名…

Java顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…

ESP8266 接入阿里云物联网云平台

AT指令集参考资料 乐鑫科技&#xff1a;基础 AT 命令集 概念浅析 物模型 是对设备在云端的功能描述&#xff0c;包括设备的属性、服务和事件。物联网平台通过定义一种物的描述语言来描述物模型&#xff0c;称之为TSL&#xff08;即 Thing Specification Language&#xff0…

【学习笔记】3D-2D:PnP

主要解决什么问题&#xff1f; 主要解决的是已知空间中N个3D点及其图像中的2D点坐标&#xff0c;求相机在空间中的位置与姿态 求解PnP问题最少需要几个点&#xff1f; 最少只需要3个点对 求解PnP问题的常用方法 主要有用3对点估计位姿的P3P&#xff0c;另外还有DLT&#x…

前端如何学会全栈分页开发?源码和思路都在这了

本项目代码已开源&#xff0c;具体见&#xff1a; 前端工程&#xff1a;vue3-ts-blog-frontend 后端工程&#xff1a;express-blog-backend 数据库初始化脚本&#xff1a;关注公众号程序员白彬&#xff0c;回复关键字“博客数据库脚本”&#xff0c;即可获取。 前言 这是博客系…

商标注册申请名称的概率,多想名称选通过率好的!

近日给深圳客户申请的商标初审下来了&#xff0c;两个类别都下的初审&#xff0c;和当初的判断基本一致&#xff0c;普推知产老杨当时沟通说需要做担保申请注册也可以&#xff0c;后面选择了管家注册&#xff0c;最近大量的帮客户检索商标名称&#xff0c;分享下经验。 两个字基…

STM32H7系统窗口看门狗 (WWDG)应用方法介绍

目录 概述 1 认识窗口看门狗 (WWDG) 1.1 窗口看门狗定义 1.2 WWDG 主要特性 2 WWDG 功能说明 2.1 WWDG框图 2.2 WWDG 内部信号 2.3 控制递减计数器 2.4 看门狗中断高级特性 2.5 如何设置看门狗超时 3 WWDG 寄存器 3.1 控制寄存器 (WWDG_CR) 3.2 配置寄存器 (W…

如何调用通义千问大模型API

目录 登录阿里云 大模型服务平台百炼 登录控制台 QWen Long QWen 通义千问开源系列 大语言模型 OpenAI接口兼容 登录阿里云 阿里云-计算&#xff0c;为了无法计算的价值 大模型服务平台百炼 降价信息&#xff1a; 登录控制台 右上角取得API key 创建Key QWen Long qw…

C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

前言&#xff1a;有时候远程服务器的进程你想偷偷去围观一下有哪些&#xff0c;或者对一些比较调皮的进程进行封杀&#xff0c;或者对一些自己研发的服务进行远程手动启动或者重启等&#xff0c;又不想打开远程桌面&#xff0c;只想悄咪咪地执行&#xff0c;那也许下面的文章会…

关于解决Qt在安装的时候没有勾选sources组件的方法

关于解决Qt在安装的时候没有勾选sources组件的方法 一、引言 在安装数据库连接到qt的时候发现没有sources文件夹&#xff0c;原来是安装的时候没有勾选sources组件&#xff0c;发现问题后找到了维护qt组件的安装方式&#xff0c;特此记下来 二、分析原因 首先在安装的时候就…

Lookin高效调试iOS App的UI

Lookin是一款iOS开发时常用的调试软件&#xff0c;由腾讯微信读书团队QMUI开发。 它可以查看和修改iOS App里的UI对象的软件&#xff0c;展示App UI图层&#xff0c;类似于Xcode自带的UI Inspector工具&#xff0c;或另一款叫做Reveal的软件。 此外&#xff0c;虽然Lookin主体…

【C++语言】继承:类特性的扩展,重要的类复用!

【C语言】继承&#xff0c;更进一步的复用 ✨精美思维导图奉上继承1. 继承的相关概念&#xff1a;2. 继承的定义&#xff1a;&#xff08;1&#xff09;定义格式&#xff1a;&#xff08;2&#xff09;访问限定符和继承方式&#xff1a;&#xff08;3&#xff09;默认继承方式&…

C++_C++11的学习

1. 统一的列表初始化 1.1&#xff5b;&#xff5d;初始化 在C98 中&#xff0c;标准就已经允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。而到了C11&#xff0c;标准扩大了用大括号括起的列表 ( 初始化列表 )的使用范围&#xff0c;使其能适用于所有的内…

最大连续1的个数(滑动窗口)

算法原理&#xff1a; 这道题大眼一看是关于翻转多少个0的问题&#xff0c;但是&#xff0c;如果你按照这种思维去做题&#xff0c;肯定不容易。所以我们要换一种思维去做&#xff0c;这种思维不是一下就能想到的&#xff0c;所以想不到也情有可原。 题目是&#xff1a;给定一…

ESP32-C6接入巴法云,Arduino方式

ESP32-C6接入巴法云&#xff0c;Arduino方式 第一、ESP32-C6开发环境搭建第一步&#xff1a;安装arduino IDE 软件第二步&#xff1a;安装esp32库第三&#xff1a;arduino 软件设置 第二&#xff1a;简单AP配网程序第一步&#xff1a;程序下载第二步&#xff1a;程序使用第三步…

linux centos nginx配置浏览器访问后端(tomcat日志)

1、配置nginx访问tomcat日志路径 vim /usr/local/nginx/conf/nginx,conflocation ^~ /logs {autoindex on;autoindex_exact_size on;autoindex_localtime on;alias /home/tomcat/apache-tomcat-9.0.89-1/logs;}###配置讲解### 1、location ^~ /logs { … }: location&#xf…

代码随想录——从前序与中序遍历序列构造二叉树(Leetcode105)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

构建智能化商场存包柜平台的数据结构设计

随着城市生活节奏的加快&#xff0c;人们对于便利的需求也越来越迫切。在城市中&#xff0c;商场存包柜平台成为了解决人们日常出行中行李存放问题的重要设施。为了更好地管理和运营这些存包柜&#xff0c;智能化商场存包柜平台的数据结构设计显得尤为关键。 一、需求分析与功能…