Java迭代器(转)(iterator详解以及和for循环的区别)

java常见小错误(二):Java迭代器iterator和for循环的区别 java常见小错误(二):Java迭代器iterator和for循环的区别 java常见错误系列文章 下一篇:java常见小错误(一):变量类型自动转换与强制转换 往期文章推荐:   java小技巧(三):JAVA 交集,差集,并集   java小技巧(二):进制转换 【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权); 本博客的内容来自于:; 学习、合作与交流联系q384660495; 本博客的内容仅供学习与参考,并非营利; 文章目录java常见小错误(二):Java迭代器iter 阅读详情

摘自http://septiny.com/java/2014/09/24/java-iterator-and-for.html

迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部.

1.Iterator

Java提供一个专门的迭代器«interface»Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器。Iterator接口实现后的功能是“使用”一个迭代器.

文档定义:

1 Package java.util;  
2 public interface Iterator<E> { 
3   boolean hasNext();//判断是否存在下一个对象元素
4   E next(); 
5   void remove();
6 } 

 

2.Iterable

Java中还提供了一个Iterable接口,Iterable接口实现后的功能是“返回”一个迭代器,我们常用的实现了该接口的子接口有: Collection, Deque, List, Queue, Set 等.该接口的iterator()方法返回一个标准的Iterator实现。实现这个接口允许对象成为 For each 语句的目标。就可以通过For each语法遍历你的底层序列。

Iterable接口包含一个能够产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动。因此如果创建了任何实现Iterable接口的类,都可以将它用于foreach语句中。

文档定义:
1 Package java.lang; 
2 
3 import java.util.Iterator;
4 public  interface Iterable<T> { 
5 Iterator<T> iterator();  
6 } 
 
使用Iterator的简单例子
复制代码
 1 import java.util.*;
 2 
 3 public class TestIterator { 
 4 
 5 public  static void main(String[] args) {
 6 
 7    List list=new ArrayList();
 8 
 9    Map map=new HashMap();
10  //初始化list和map的数据
11   for(int i=0;i<10;i++){
12 
13     list.add(new String("list"+i) );
14 
15     map.put(i, new String("map"+i));
16 
17   } 
18 
19 Iterator iterList= list.iterator();//List接口实现了Iterable接口
20   //循环list 
21  while(iterList.hasNext()){
22 
23    String strList=(String)iterList.next();  
24 
25    System.out.println(strList.toString());  
26 
27   } 
28 
29  Iterator iterMap=map.entrySet().iterator();
30   //循环map
31    while(iterMap.hasNext()){
32 
33      Map.Entry strMap=(Map.Entry)iterMap.next();
34 
35      System.out.println(strMap.getValue());  
36 
37    } 
38 
39 } 
40 
41 } 
复制代码

接口Iterator在不同的子接口中会根据情况进行功能的扩展,例如针对List的迭代器ListIterator,该迭代器只能用于各种List类的访问。ListIterator可以双向移动。添加了previous()等方法.

 

3 Iterator与泛型搭配

Iterator对集合类中的任何一个实现类,都可以返回这样一个Iterator对象。可以适用于任何一个类。

因为集合类(List和Set等)可以装入的对象的类型是不确定的,从集合中取出时都是Object类型,用时都需要进行强制转化,这样会很麻烦,用上泛型,就是提前告诉集合确定要装入集合的类型,这样就可以直接使用而不用显示类型转换.非常方便.

 

4.foreach和Iterator的关系

for each是jdk5.0新增加的一个循环结构,可以用来处理集合中的每个元素而不用考虑集合定下标。

格式如下

1 for(variable:collection){ statement; }

 

定义一个变量用于暂存集合中的每一个元素,并执行相应的语句(块)。collection必须是一个数组或者是一个实现了lterable接口的类对象。

上面的例子使用泛型和forEach的写法:  
复制代码
 1 import java.util.*;
 2 public  class TestIterator { 
 3 
 4 public  static void main(String[] args) {
 5 
 6 List<String> list=new ArrayList<String> ();
 7 
 8 for(int i=0;i<10;i++){
 9   list.add(new String("list"+i) );
10 } 
11 
12 for(String str:list){
13   System.out.println(str); 
14 } 
15 
16 } 
复制代码

 

使用for循环时,在循环内使用list.remove()会导致错误,可以使用如下方法:

for(int i = 0; i < list.size();i++){
  if(true){
	list.remove(list.get(i));
	--i;//remove的同时下标跟着减
	}
}

可以看出,使用for each循环语句的优势在于更加简洁,更不容易出错,不必关心下标的起始值和终止值。

forEach不是关键字,关键字还是for,语句是由iterator实现的,他们最大的不同之处就在于remove()方法上。

一般调用删除和添加方法都是具体集合的方法,例如:

List list = new ArrayList(); list.add(…); list.remove(…);

但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。

forEach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式。

 

4 使用for循环与使用迭代器iterator的对比

效率上的各有有事

采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快

采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快

从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.

关于for丶foreach丶iterator 迭代器 关于for丶foreach丶iterator 迭代器 1丶前言:我们在网上或者在讨论的时候往往会有这么一种说法:foreach 也是迭代器的一类,底层实现的是迭代器。但是这种说法并不严谨,也可以说这种说法对于我们正常的理解来说并不是能够完全理解。 2丶首先我来说出结论:for 丶 foreach 丶迭代器 这三个遍历方法中 不应该将他们三种遍历方法归在一起 而是将其分成三类)——不要将foreach 归为迭代器的一种遍历 (我们一步一步来,首先来简单介绍一下这是那种方法的区别) 3丶区别: 1 阅读详情

相关推荐

K210视觉项目上位机避坑指南:解决C#解析ESP8266 TCP图像流的乱码、卡顿与连接中断

本文详细解析了K210与ESP8266在视觉项目中的上位机开发问题,重点解决TCP图像流解析中的乱码、卡顿与连接中断问题。通过自定义协议、JPEG流重组、TCP连接优化等实战技巧,提升系统稳定性和性能,适用于嵌入式视觉开发者和C#上位机程序员。

weixin_28730131的博客 402

Simulink建模基础: For Iterator子系统及其代码

本文研究Simulink中的For循环子系统及其生成的代码。 文章目录1 Simulink中的For循环子系统2 For循环子系统建模示例 1 Simulink中的For循环子系统 不管是在C语言还是Matlab脚本编程的时候,都避免不了使用for循环来反复执行某一段代码。在Simulink中,也可以通过For循环子系统来实现循环功能。 新建一个For循环子系统(For Iterator Subsystem),会默认带有一个输入输出port。 进入子系统内部,会有一个默认的For迭代器(For Itera

u013288925的博客 1万+

电源工程师必看:平均电流模式BUCK双环控制详解(从传递函数到Psim仿真)

本文详细解析了平均电流模式BUCK变换器的双环控制策略,从传递函数推导到Psim仿真实现。针对电源工程师关注的环路设计和稳定性问题,深入比较了电压模式、峰值电流模式和平均电流模式的优缺点,并提供了12V/3A BUCK变换器的完整设计案例,帮助工程师掌握平均电流控制这一中高功率应用的首选方案。

weixin_42696271的博客 398

java基础(三) 加强型for循环与Iterator

戳上面的蓝字关注我们哦!精彩内容 精选java等全套视频教程精选java电子图书大数据视频教程精选java项目练习精选 引言  从JDK1.5起,增加了加强型的for循环语法,也...

好好学java 645

告别命令行恐惧!用nTopology可视化工具5分钟搞定三维Voronoi泡沫建模

本文介绍如何利用nTopology可视化工具快速生成三维Voronoi泡沫结构,无需编程即可完成复杂建模。Voronoi结构在轻量化设计、能量吸收和生物医学等领域具有重要应用,传统命令行方法门槛较高。通过nTopology的四步流程,用户可在5分钟内创建仿真就绪模型,大幅提升设计效率。

weixin_30764771的博客 427

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 649

For循环和Iterator遍历

Iterator是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离 package list; import java.util.*; /** * @author * @FileName javaproject * @Date 2019/11/23 8:52 */ public class ArrayListDemo { public static v...

凌霄 688

【RT-DETR涨点改进】全网独家-特征融合改进篇 | AAAI 2025 顶会| 高效涨点,RT-DETR利用CDFA对比度特征聚合模块,适用于目标检查(全网独家创新)

本文提出了一种基于CDFA模块的多级特征融合优化RT-DETR模型,用于解决医学图像分割中的软边界模糊、小目标和共现现象等问题。CDFA模块通过对比度特征聚合、局部特征增强和多级注意力机制,有效提升模型性能。研究提供了三种改进方案(rtdetr-r18/y50/l-CDFA),并在多个医学数据集上验证了其有效性。核心创新包括语义信息解耦、对比驱动特征融合和尺寸感知解码器。实验结果表明,该方法在分割精度和鲁棒性方面达到SOTA水平。

Ai缝合怪、助力小伙伴高效发论文 510

java 迭代循环_Java迭代器(转)(iterator详解以及和for循环的区别)

迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部.1.IteratorJava提供一个专门的迭代器«interface»Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器。Iterator接口实现后的功能是“使用”一个迭代器.文档定义...

weixin_39924481的博客 278

从权限对象到业务角色:把 SAP Authorization Object 讲清楚,并用 ABAP 写对一次 AUTHORITY-CHECK

摘要:SAP权限管理的核心在于Authorization Object(授权对象),它通过组合最多10个授权字段来精确控制用户访问权限。关键要点包括:1) 授权对象与ACTVT字段(如01创建/02修改/03显示)的配合使用;2) ABAP中AUTHORITY-CHECK语句的四种常见返回码(0通过/4字段不匹配/12无权限/40无效用户);3) 系统自动执行的S_TCODE事务码检查;4) 自定义授权对象时应遵循"最少且足够"原则,优先复用标准对象。在RAP和OData场景中,权限检查

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 272

Objective-C实现人工势场法(附完整源码)

Objective-C实现人工势场法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 427

java容器(八)---Java迭代器(转)(iterator详解以及和for循环的区别)

迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部. 1.Iterator Java提供一个专门的迭代器>Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器。Iterator接口实现后的功能是“使用”一个迭代器.

a1091220321的专栏 1052

学Simulink——基于Simulink的AUTOSAR架构下电机控制软件组件建模

本文详细介绍了在Simulink中基于AUTOSAR架构开发电机控制软件组件(SWC)的全流程。主要内容包括:首先阐述了AUTOSAR架构对汽车电子系统开发的价值,包括提高软件复用率、降低集成成本和改善验证环境。然后重点讲解了在Simulink中构建电机控制SWC的具体步骤:从创建AUTOSAR组件模型、定义数据端口和服务端口,到搭建FOC控制算法、配置运行实体,最后生成AUTOSAR描述文件和验证RTE接口。文章还提供了与基础软件(BSW)的集成方案、工程实践要点和常见问题解决方案,并以大众MEB平台等实

amy_mhd的博客 68

Java迭代器(iterator详解以及和for循环的区别)

前言:        迭代器是一种模式、详细可见其设计模式,可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。Iterable:实现这个接口的集合对象支持迭代,是可以迭代的。实现了这个可以配合foreach使用~Iterator:迭代器,提供迭代机制的对象,具体如何迭代是这个Iterator接口...

Jae_Wang的博客 7万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【java细节】for循环,for-each(增强for循环),forEach以及Iterator迭代器对比

【java细节】for循环,for-each(增强for循环),forEach以及Iterator迭代器对比

MR_Peach07的博客 3064

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java中的Iterable与Iterator详解

Java中的Iterable与Iterator详解 在Java中,我们可以对List集合进行如下几种方式的遍历: List<Integer> list = new ArrayList<>(); list.add(5); list.add(23); list.add(42); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + ","); } Iterator it = li

冬的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java 迭代器 iterator 和 for 循环的区别

迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。 一、Iterator Java 提供一个专门的迭代器 «interface»Iterator,可以对某个序列实现该接口,来提供标准的 Java 迭代器。实现 Iterator 后的功能是“使用”一个迭代器。文档定义: Package java.util; public interface Iterator<E> { b

ChineseSoftware的博客 1812

Java——迭代器iterator详解

一、Iterator的API       关于Iterator主要有三个方法:hasNext()、next()、remove()       hasNext:没有指针下移操作,只是判断是否存在下一个元素       next:指针下移,返回该指针所指向的元素       remove:删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素   二...

qq_36470686的博客 2965

【设计模式】迭代器模式 ——详解Iterator、foreach与for循环的区别

参考:B站UP主动力节点。

日常总结,想起来了存一下 1394

java 迭代器 for循环_JAVA集合的遍历for循环、Iterator迭代器

java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。我们要取出这些集合中的元素,可通过一种通用的获取方式来完成。Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。Iterator迭代器有hasNext()方法:用来判断集合中是否有...

weixin_32401763的博客 1607

java迭代器和for循环区别_迭代器和增强for循环

Iterator迭代器的使用:迭代:Iterator,即collection集合元素的通用获取方式java.util.Iterator接口。迭代器(对集合进行遍历)有两个常用的方法Boolean hasNext()如果仍有元素可以迭代,则返回true判断集合中还有没有下一个元素,有就返回true,没有就返回falseE next()返回迭代的下一个元素取出集合中的下一个元素Iterator迭代器,...

weixin_42123296的博客 4169
上一篇: ArrayList的subList方法
下一篇: Java HashMap中在resize()时候的rehash,即再哈希法的理解
ole_triangle_java
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值