java基础入门学习09-迭代器

文章目录

  • 一、引言
  • 二、迭代器
    • 2.1 迭代器对象的创建
    • 2.2 迭代器的使用

一、引言

迭代器是设计模式的一种,迭代器模式提供方法来访问容器中的的元素,这听起来跟c语言中指针十分相似,其实数组访问中的指针本质上就是迭代器的一种。Iterrator对象就是迭代器,而iterator() 是 Java 集合框架中的一个方法,它返回一个 Iterator 对象,该对象可以用来遍历集合中的元素。

二、迭代器

2.1 迭代器对象的创建

在讲如何创建迭代器对象之前首先需要了解的是迭代器的种类,这里引用一下FASTR博主中的类结构图来说明
在这里插入图片描述
通过底层代码的查看我们可以发现在Iterable接口中有一个Iterator方法,它返回一个Iterator对象。

public interface Iterable<T> {/*** Returns an iterator over elements of type {@code T}.** @return an Iterator.*/Iterator<T> iterator();

而Iterator对象中则是拥有三个方法

public interface Iterator<E> {boolean hasNext();E next();default void remove() {throw new UnsupportedOperationException("remove");}
返回值类型方法名功能
booleanhasNext()判断集合是否还有元素,如果返回 true 表示集合还有元素,返回 false 表示集合中没有元素
Enext()获取集合中的下一个元素,通常搭配hasNext()来使用,判断出存在元素再使用该方法获取下一个元素
voidremove()删除集合中的元素。

在了解了类结构图之后我们就可以使用iterator()方法来创建对应的迭代器对象。

2.2 迭代器的使用

我们先来看一下最常见的ArrayList集合的迭代器使用案例

package pojo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IteTest {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Iterator<Integer> iterator = list.iterator();while(iterator.hasNext()) {int value = iterator.next();System.out.print(value + " ");}}
}

运行结果为:
在这里插入图片描述
在该案例中,首先hasNext()方法的指针先指向1,确定存在该元素后打印,然后是2,3。在3之后由于没有下一个元素就会跳出while循环。
上述案例演示了hasNext和next方法的基本使用,那么remove()其实在迭代器中的使用也十分简单

package pojo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IteTest {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Iterator<Integer> iterator = list.iterator();while(iterator.hasNext()) {int value = iterator.next();if(value == 1) iterator.remove();}System.out.println("删除后" + list);}
}

运行结果为:元素1被删除
在这里插入图片描述
那么Iterator的子类ListIterator有什么特殊之处呢。它允许程序员在列表(如 ArrayList、LinkedList 等)中双向遍历,同时支持元素的添加和删除操作。我们可以看一下底层代码中对几个新方法的描述

    /*** Returns {@code true} if this list iterator has more elements when* traversing the list in the reverse direction.  (In other words,* returns {@code true} if {@link #previous} would return an element* rather than throwing an exception.)** @return {@code true} if the list iterator has more elements when*         traversing the list in the reverse direction*/boolean hasPrevious();/*** Returns the previous element in the list and moves the cursor* position backwards.  This method may be called repeatedly to* iterate through the list backwards, or intermixed with calls to* {@link #next} to go back and forth.  (Note that alternating calls* to {@code next} and {@code previous} will return the same* element repeatedly.)** @return the previous element in the list* @throws NoSuchElementException if the iteration has no previous*         element*/E previous();/*** Returns the index of the element that would be returned by a* subsequent call to {@link #next}. (Returns list size if the list* iterator is at the end of the list.)** @return the index of the element that would be returned by a*         subsequent call to {@code next}, or list size if the list*         iterator is at the end of the list*/int nextIndex();/*** Returns the index of the element that would be returned by a* subsequent call to {@link #previous}. (Returns -1 if the list* iterator is at the beginning of the list.)** @return the index of the element that would be returned by a*         subsequent call to {@code previous}, or -1 if the list*         iterator is at the beginning of the list*/int previousIndex();/*** Replaces the last element returned by {@link #next} or* {@link #previous} with the specified element (optional operation).* This call can be made only if neither {@link #remove} nor {@link* #add} have been called after the last call to {@code next} or* {@code previous}.** @param e the element with which to replace the last element returned by*          {@code next} or {@code previous}* @throws UnsupportedOperationException if the {@code set} operation*         is not supported by this list iterator* @throws ClassCastException if the class of the specified element*         prevents it from being added to this list* @throws IllegalArgumentException if some aspect of the specified*         element prevents it from being added to this list* @throws IllegalStateException if neither {@code next} nor*         {@code previous} have been called, or {@code remove} or*         {@code add} have been called after the last call to*         {@code next} or {@code previous}*/void set(E e);/*** Inserts the specified element into the list (optional operation).* The element is inserted immediately before the element that* would be returned by {@link #next}, if any, and after the element* that would be returned by {@link #previous}, if any.  (If the* list contains no elements, the new element becomes the sole element* on the list.)  The new element is inserted before the implicit* cursor: a subsequent call to {@code next} would be unaffected, and a* subsequent call to {@code previous} would return the new element.* (This call increases by one the value that would be returned by a* call to {@code nextIndex} or {@code previousIndex}.)** @param e the element to insert* @throws UnsupportedOperationException if the {@code add} method is*         not supported by this list iterator* @throws ClassCastException if the class of the specified element*         prevents it from being added to this list* @throws IllegalArgumentException if some aspect of this element*         prevents it from being added to this list*/void add(E e);

E previous() 返回列表中的前一个元素,并将迭代器位置向后移动一个位置。
int nextIndex() 返回对 next 的后续调用将返回的元素的索引(在正向遍历列表中时)。
int previousIndex() 返回对 previous 的后续调用将返回的元素的索引(在反向遍历列表中时)。
void set(E e) 用指定的元素替换上次 next 或 previous 访问的元素(可选操作)。
void add(E e) 将指定的元素插入列表(可选操作)。该元素将插入到 next 或 previous 最后一次访问的位置。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度解析:Android APP集成与拉起微信小程序开发全攻略

目录 一、背景以及功能介绍 二、Android开发示例 2.1 下载 SDK 2.2 调用接口 2.3 获取小程序原始Id 2.4 报错提示&#xff1a;bad_param 2.4.1 错误日志 2.4.2 解决方案 相关推荐 一、背景以及功能介绍 需求&#xff1a;产品经理需要APP跳转到公司的小程序(最好指定页…

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num&#xff1a;{num}\nnum数据类型为&#xff1a;{type(num)}") # 求集合中元素个数 print(f"num中元素个数为&#xff1a;{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…

Android 单元测试环境配置问题 Execution failed for task ‘:mergeDebugJavaResource‘.

背景和挑战 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI在各行各业的应用前景被普遍看好。无论是在医疗、金融、教育&#xff0c;还是在软件开发领域&#xff0c;AI都展示出了巨大的潜力。然而&#xff0c;尽管AI能够在许多方面提供支持和提升效率&a…

无人机应用场景:石油管道巡检技术详解

无人机在石油管道巡检中的应用&#xff0c;以其高效、便捷、灵活的特点&#xff0c;为石油管道的安全管理提供了有力支持。以下是对无人机在石油管道巡检技术方面的详细解析&#xff1a; 一、无人机巡检技术的概述 无人机巡检技术是指利用无人机搭载各种传感器和检测设备&…

51c嵌入式~单片机合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信&#xff1f; 下面这个“电平转换”电路&#xff0c;理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

Qt主线程把数据发给子线程,主线程会阻塞吗

演示&#xff1a; #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…

C++内存池实现

1.内存池概念 内存池就和其他的池数据&#xff08;如线程池&#xff09;结构类似&#xff0c;由程序维护一个“池”结构来管理程序使用的内存&#xff0c;然后根据需要从内存池中申请使用内存或者向内存池中释放内存&#xff0c;来达到高效管理内存的目的。 在一般的内存管理的…

STM32设计学生宿舍监测控制系统

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 随着科技的飞速发展和智能化时代的到来&#xff0c;学生宿舍的安全、舒适…

企业如何提高招聘能力?

企业如何提高招聘能力&#xff1f; 许多企业在进行招聘工作时&#xff0c;常常会遇到各种问题和挑战。尽管付出了大量的时间和精力&#xff0c;但结果却并不总是如人意。例如&#xff0c;企业可能会经历一次又一次的面试&#xff0c;却仍然找不到一个能够适应岗位要求的合适人…

大模型在蓝鲸运维体系应用——蓝鲸运维开发智能助手

本文来自腾讯蓝鲸智云社区用户: CanWay 背景 1、运维转型背景 蓝鲸平台从诞生之初&#xff0c;就一直在不遗余力地推动运维转型&#xff0c;让运维团队可以通过一体化PaaS平台&#xff0c;快速编写脚本&#xff0c;编排流程&#xff0c;开发运维工具&#xff0c;从被动地提供…

3588 yolov8 onnx 量化转 rknn 并运行

本教程重点不在如何训练模型&#xff0c;重点是全流程链路&#xff0c;想学训练的可以网上找教程 环境 python 3.10.xrknn-toolkit2-2.2.0ultralytics_yolov8rknn 驱动版本2.2 模型训练 yolov8仓库地址&#xff1a;https://github.com/airockchip/ultralytics_yolov8.git下载…

Vue 组件通信及进阶语法

文章目录 一、scoped 样式冲突二、data 是一个函数三、组件通信1. 父子通信1.1 props 校验1.2 props 比较 data 2. 非父子通信2.1 event bus2.2 provide-inject 四、进阶语法1. v-model 详解2. sync 修饰符3. ref 和 $refs4. $nextTick 一、scoped 样式冲突 注意点&#xff1a;…

LeetCode105.从前序与中序遍历构造二叉树

题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 提示: 1 < preorder.length < 3000inorder.length preorder.length-3000 < pr…

【问卷调研】HarmonyOS SDK开发者社区用户需求有奖调研

问卷请点击&#xff1a;HarmonyOS SDK开发者社区用户需求有奖调研

IOT物联网低代码可视化大屏解决方案汇总

目录 参考来源云服务商阿里云物联网平台产品主页产品文档 开源项目DGIOT | 轻量级工业物联网开源平台项目特点项目地址开源许可 IoTGateway | 基于.NET6的跨平台工业物联网网关项目特点项目地址开源许可 IoTSharp | 基于.Net Core开源的物联网基础平台项目特点项目地址开源许可…

如何在Mac上切换到JDK 17开发环境

在本文中&#xff0c;我将为您介绍如何在Mac上切换到JDK 17&#xff0c;包括下载和安装JDK 17、设置环境变量、在IntelliJ IDEA中配置项目、修改Maven编译配置&#xff0c;并最终使用mvn clean install重新编译项目。通过这个流程&#xff0c;您可以顺利地将开发环境升级到JDK …

玩转ChatGPT:文献阅读 v2.0

一、写在前面 好久不更新咯。 因为最近ChatGPT更新了不少功能&#xff08;水一篇刷存在感&#xff09;&#xff1a; 上线ChatGPT-4o模型&#xff0c;说推理能力还不错&#xff1b;上线联网功能&#xff0c;类似Kimi那种。 所以呢&#xff0c;用它来读文献就挺舒服的了。例如…

自动驾驶系列—从数据采集到存储:解密自动驾驶传感器数据采集盒子的关键技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…