java-迭代器

## Java中的迭代器

### 1. 介绍

迭代器(Iterator)是Java集合框架中一个重要的接口,用于遍历集合中的元素。迭代器提供了一种通用的方法来访问集合中的每个元素,而不需要了解集合的底层实现。Java中的迭代器支持集合的顺序遍历,同时还提供了一些基本的集合操作方法。

### 2. 迭代器的基本概念

Java中的迭代器接口位于`java.util`包中,主要提供了以下三个方法:

- `boolean hasNext()`: 如果仍有元素可以迭代,则返回 `true`。
- `E next()`: 返回迭代的下一个元素。
- `void remove()`: 从集合中移除由迭代器返回的最后一个元素(可选操作)。

除了 `Iterator` 接口,Java 还提供了一个增强版的迭代器接口 `ListIterator`,用于双向遍历 `List` 集合,并支持更丰富的操作。

### 3. 迭代器的实现

Java中的每个集合类(如 `ArrayList`、`HashSet`、`LinkedList` 等)都实现了 `Iterable` 接口,这意味着它们都提供了 `iterator()` 方法来返回一个迭代器对象。以下是一些常见集合类如何使用迭代器的示例。

#### 3.1 使用 `ArrayList` 的迭代器

```java
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListIteratorExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }
    }
}
```

#### 3.2 使用 `HashSet` 的迭代器

```java
import java.util.HashSet;
import java.util.Iterator;

public class HashSetIteratorExample {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);

        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()) {
            Integer element = iterator.next();
            System.out.println(element);
        }
    }
}
```

#### 3.3 使用 `LinkedList` 的迭代器

```java
import java.util.Iterator;
import java.util.LinkedList;

public class LinkedListIteratorExample {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("Dog");
        list.add("Cat");
        list.add("Horse");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }
    }
}
```

### 4. `ListIterator` 接口

`ListIterator` 是 `Iterator` 接口的子接口,提供了更多的方法来支持双向遍历和修改列表中的元素。`ListIterator` 仅适用于 `List` 类型的集合(如 `ArrayList`、`LinkedList`)。

`ListIterator` 的方法包括:

- `boolean hasNext()`: 如果列表中有下一个元素,则返回 `true`。
- `E next()`: 返回列表中的下一个元素。
- `boolean hasPrevious()`: 如果列表中有上一个元素,则返回 `true`。
- `E previous()`: 返回列表中的上一个元素。
- `int nextIndex()`: 返回下一个元素的索引。
- `int previousIndex()`: 返回上一个元素的索引。
- `void remove()`: 移除由迭代器返回的最后一个元素。
- `void set(E e)`: 用指定的元素替换最后一次调用 `next()` 或 `previous()` 返回的元素。
- `void add(E e)`: 将指定的元素插入列表中。

#### 使用 `ListIterator` 示例

```java
import java.util.ArrayList;
import java.util.ListIterator;

public class ListIteratorExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Red");
        list.add("Green");
        list.add("Blue");

        ListIterator<String> listIterator = list.listIterator();

        System.out.println("Forward traversal:");
        while (listIterator.hasNext()) {
            String element = listIterator.next();
            System.out.println(element);
        }

        System.out.println("\nBackward traversal:");
        while (listIterator.hasPrevious()) {
            String element = listIterator.previous();
            System.out.println(element);
        }
    }
}
```

### 5. 迭代器的实际应用

迭代器不仅用于遍历集合,还可以用于在遍历的同时进行集合的修改。

#### 5.1 在遍历过程中移除元素

使用迭代器可以安全地在遍历过程中移除集合中的元素,而不会抛出 `ConcurrentModificationException`。

```java
import java.util.ArrayList;
import java.util.Iterator;

public class RemoveElementExample {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer element = iterator.next();
            if (element % 2 == 0) {
                iterator.remove();
            }
        }

        System.out.println("List after removal: " + list);
    }
}
```

#### 5.2 在遍历过程中修改元素

`ListIterator` 提供了 `set` 和 `add` 方法,可以在遍历过程中修改和添加元素。

```java
import java.util.ArrayList;
import java.util.ListIterator;

public class ModifyElementExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        list.add("three");

        ListIterator<String> listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            String element = listIterator.next();
            if (element.equals("two")) {
                listIterator.set("TWO");
            }
        }

        System.out.println("List after modification: " + list);
    }
}
```

### 6. 迭代器与for-each循环

Java 提供了增强的 for 循环(for-each 循环),它是基于迭代器的语法糖,简化了遍历集合的代码。for-each 循环内部实际使用了迭代器,但代码更加简洁和易读。

```java
import java.util.ArrayList;

public class ForEachLoopExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        for (String element : list) {
            System.out.println(element);
        }
    }
}

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

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

相关文章

从 ClickHouse 到 Apache Doris:快成物流的数智化货运应用实践

导读&#xff1a;随着快成物流的大宗商品产业链的不断发展&#xff0c;货运轨迹规划和实时数据分析的需求日益迫切&#xff0c;为了保障数据报表更新、用户画像圈选与物流轨迹实时更新等大数据核心系统性能&#xff0c;快成物流引入 Apache Doris 实时数仓升级了大数据算法平台…

乘积最大子数组

代码实现&#xff1a; 方法一&#xff1a;暴力法 方法二&#xff1a;动态规划 int maxProduct(int *nums, int numsSize) {long imax nums[0], imin nums[0], res nums[0];for (int i 1; i < numsSize; i) {if (nums[i] < 0) {int temp imax;imax imin;imin temp;…

Taogogo Taocms v3.0.2 远程代码执行漏洞(CVE-2022-25578)

前言 CVE-2022-25578 是一个存在于 Taogogo Taocms v3.0.2 中的代码注入漏洞。此漏洞允许攻击者通过任意编辑 .htaccess 文件来执行代码注入。 漏洞详情 漏洞描述&#xff1a;攻击者可以利用此漏洞上传一个 .htaccess 文件到网站&#xff0c;并在文件中注入恶意代码&#xf…

oracle11.2.0.4 RAC 保姆级静默安装(一) GI集群软件

一、响应文件准备 我们直接使用软件解压后的response文件夹中的响应文件模板进行修改 选择当前服务器的主机名,产品目录是在已存在的/u01/app目录基础上自动创建的无需提前创建oraInventory 按需选择语言,具体语言配置参考表格 一般rac默认选择安装类型为CRS_CONFIG 对应正…

设计模式-状态模式和策略模式

1.状态模式 1.1定义 当一个对象的内在状态改变时允许根据当前状态作出不同的行为&#xff1b; 1.2 适用场景 (1)一个对象的行为取决于它的状态,并且它必须在运行时根据状态来决定其行为. (2)代码中包含了大量的与状态有关的条件语句,例如:一个操作含有庞大的多分值语句(if…

工厂应用的工业一体机需要满足那些条件?

工业一体机作为工业自动化领域中的重要组成部分&#xff0c;已经广泛应用于制造业、加工业和其他工业领域。随着工业4.0时代的到来&#xff0c;工业一体机的使用变得愈加普遍和复杂。为了确保工业一体机在工厂应用中的稳定运行和高效运作&#xff0c;需要满足一些必要的条件。 …

JELR-630HS漏电继电器 30-500mA 导轨安装 约瑟JOSEF

JELR-HS系列 漏电继电器型号&#xff1a; JELR-15HS漏电继电器&#xff1b;JELR-25HS漏电继电器&#xff1b; JELR-32HS漏电继电器&#xff1b;JELR-63HS漏电继电器&#xff1b; JELR-100HS漏电继电器&#xff1b;JELR-120HS漏电继电器&#xff1b; JELR-160HS漏电继电器&a…

Nuxt3 的生命周期和钩子函数(九)

title: Nuxt3 的生命周期和钩子函数&#xff08;九&#xff09; date: 2024/7/3 updated: 2024/7/3 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt3中与Vite相关的五个生命周期钩子&#xff0c;包括vite:extend、vite:extendConfig、vite:configResolved、vite…

技术成神之路:设计模式(三)原型模式

1. 定义 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在通过复制现有对象来创建新对象&#xff0c;而不是通过实例化类的方式。这个模式可以提高对象创建的效率&#xff0c;尤其是在创建对象的过程非常复杂或代价高昂时。 2. 结构 原…

创建线程的五种方式

一.继承Thread ,重写run class MyThread extends Thread{Overridepublic void run() {//这里的内容就是该线程要完成的工作while(true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeExceptio…

亚马逊跟卖卖家还在选品发愁吗!已经有卖家用这种方式选品大卖!

对于亚马逊相信很多卖家都不陌生&#xff0c;也有很多新手卖家涌入&#xff0c;但是进入后就不知道怎么选品了&#xff0c;很多新手卖家是不是天天盯着亚马逊页面的产品&#xff0c;眼花撩乱的&#xff0c;不知道那些产品&#xff0c;能跟卖那些不能跟卖&#xff0c;也有些卖家…

Nginx详解-安装配置等

目录 一、引言 1.1 代理问题 1.2 负载均衡问题 1.3 资源优化 1.4 Nginx处理 二、Nginx概述 三、Nginx的安装 3.1 安装Nginx 3.2 Nginx的配置文件 四、Nginx的反向代理【重点】 4.1 正向代理和反向代理介绍 4.2 基于Nginx实现反向代理 4.3 关于Nginx的location路径…

使用python做飞机大战

代码地址: 点击跳转

从.mat文件中导入数据到simulink进行FFT分析

1. 在matlab中准备数据 .mat 文件中包含时间向量和需要分析的数据 load(fcssiabc061302.mat);提取时间和需要分析的数据 time fcssiabc061302.X.Data; % 时间向量 signal fcssiabc061302.Y(1).Data; % A相电流数据 将数据转换为“structure with time”格式…

力扣67 二进制求和

文章目录 1. 题目链接2. 题目代码3.感受 1. 题目链接 二进制求和 2. 题目代码 class Solution { public:string addBinary(string a, string b) {vector<int> stringA;vector<int> stringB;int lengthOfA a.length();int lengthOfB b.length();for(int subscrip…

STELLA系统动态模拟技术及在农业、生态及环境等科学领域中的应用技术

STELLA是一种用户友好的计算机软件。通过绘画出一个系统的形象图形&#xff0c;并给这个系统提供数学公式和输入数据&#xff0c;从而建立模型。依据专业兴趣&#xff0c;STELLA可以用来建立各种各样的农业、生态、环境等方面的系统动态模型&#xff0c;为科研、教学、管理服务…

SpringBoot:集成机器学习模型进行预测和分析

引言 机器学习在现代应用程序中扮演着越来越重要的角色。通过集成机器学习模型&#xff0c;开发者可以实现智能预测和数据分析&#xff0c;从而提高应用程序的智能化水平。SpringBoot作为一个强大的框架&#xff0c;能够方便地集成机器学习模型&#xff0c;并提供灵活的部署和…

pycharm远程连接和conda环境参考博客自用整理

pycharm远程连接 pycharm的连接需要先用xftp把项目上传上去&#xff08;包括venv&#xff09;&#xff0c;似乎才能连 https://blog.csdn.net/weixin_41174300/article/details/134420981 注意要上传一份一模一样的&#xff0c;然后在deployment里面添加mapping 注意传输文件…

帮人安装打印机驱动踩过的坑

自从当了程序员&#xff0c;总被人认为是无所不能。安装系统&#xff0c;组装电脑都会。有啥只要跟电脑沾点边的事情都来找我。这不今天就被叫去帮人安装打印机驱动。 问题描述 以前老电脑都可以用打印机的&#xff0c;自从换新电脑后就不行了。别人可以用&#xff0c;就他的新…

AI替换:FaceFu V3.5.0软件下载,附教程

FaceFusion是一个基于WebUI的AI替换项目。 代码结构非常清晰&#xff0c;编码比较优秀&#xff0c;也正在变得更加实用。 前段时间也更新了不少内容。 今天统一通知一下&#xff0c;并且更新一下软件包。 具体的更新内容如下&#xff1a; V2.3.0更新内容&#xff1a; 引入…