关于ArrayList和Iterator的一点误用的理解

为什么ArrayList在使用迭代器迭代元素时不能使用List.remove()删元素,而是使用Iterator.remove()删元素 其实,我相信有一定经验的都已经知道了,把标题的“为什么”去掉读一遍,但是具体是为什么?今天本人跟进源码(jdk7)探了个究竟。注:这篇文章只介绍使用list.remove()抛出ConcurrentModificationException的原因,其它参数及异常不作介绍。直入主题,首先我们来看下面这段出问题的代码下面是运行结果使用iterator.remove()是没有问题的,此处就不粘图了由运行... 阅读详情

具体代码

ArrayList list=new ArrayList();
list.add("abc");
list.add("abcd");
list.add("123");
list.add("1234");

while(list.iterator().hasNext())
{
  System.out.println(list.iterator().next();
}
这段代码会陷入一个死循环永远输出"abc".......,为什么?
我是这样一来猜测的,iterator()方法会返回一个Iterator对象,但是在ArrayList中并不会保存这个Iterator对象;所以
该iterator()方法执行完以后再来执行该方法ArrayList会产生一个新的Iterator对象;新对象跟前一对象没有任何关系,只是内容一致
有了猜测就需要去验证,去ARRAYLIST的父类AbstractList一看,果然如此
public Iterator<E> iterator() {
    return new Itr();
    }
对上面的情形我们就需要修改成如下形式

Iterator iterator=list.iterator();

while(iterator.hasNext())
{
  System.out.println(iterator.next();
}
这样通过一个变量指向ARRAYLIST创建的Iterator对象,然后在循环过程中对该Iterator对象进行操作从而达到我们的设计需要;

"黑马程序员"基础测试:创建ArrayList对象,添加五个元素,使用Iterator遍历输出 今天的任务是把,不会做的某一个题目做出来,然后贴上 阅读详情

相关推荐

点云入门笔记(一):点云数据及获取

点云概念: 点云是某个坐标系下的点的数据集。点包含了丰富的信息,包括三维坐标 X,Y,Z、颜色、分类值、强度值、时间等等。

wc19862274581的博客 2万+

ArrayList中Iterator的研究学习

最近去某公司面试,被问到了一个简单的问题,ArrayList中要删除一些元素应该怎么操作?答曰:"使用Iterator迭代器遍历,判断之后再用迭代器提供的remove()方法将判断为true的元素删掉",问:“为什么要选择这个方法?”答曰:“迭代器采用的是fail-fast机制,foreach循环内部调用了迭代器,删除元素破坏了集合的结构,所以会报错”,追问:“为什么不能用for循环...

weixin_30955341的博客 163

华为云Stack 8.X 流量模型分析(一)

​ 当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。​ 内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

Ciyaso的博客 3244

ArrayList中的Iterator详解

每个实现Iterable接口的类必须提供一个iterator方法,返回一个Iterator对象,ArrayList也不例外 public Iterator<E> iterator() { return new Itr(); } 返回的是一个Itr类的对象,接下来我们来看它的部分源码 protected transient int modCount = 0; priv...

yztfst的博客 3029

基于树莓派与ROS的桌面机器人开发:从硬件组装到AI集成实战

嵌入式系统与机器人操作系统(ROS)是构建智能硬件的核心技术基础。嵌入式系统为设备提供了专用计算与控制能力,而ROS作为机器人开发的中间件框架,通过节点、话题和服务等机制,实现了感知、决策、执行等模块间的松耦合通信与高效集成。这种架构极大地提升了机器人系统的可扩展性与可维护性,其技术价值在于能够将复杂的AI算法,如计算机视觉和语音识别,与实体硬件执行机构无缝结合,从而快速构建出具备环境交互能力的智能体。在桌面机器人、教育套件及服务机器人原型开发等应用场景中,该技术栈尤为适用。本文以开源的Wall-E桌面机器

weixin_26775679的博客 650

Hadoop在大数据领域的电商数据分析案例

随着电商行业的迅猛发展,每天都会产生海量的数据,如用户浏览记录、购买行为、商品信息等。如何从这些数据中提取有价值的信息,为电商企业的决策提供支持,成为了电商企业面临的重要问题。Hadoop作为一个开源的分布式计算平台,具有高可靠性、高扩展性和高效性等特点,能够很好地处理大数据。本文的目的就是通过实际案例,详细介绍Hadoop在电商数据分析中的应用,范围涵盖了从数据采集、存储到分析的整个流程。本文首先介绍背景信息,让读者了解Hadoop在电商数据分析中的重要性和应用场景。

Java大师兄的博客 1178

【JAVA练习-----集合API】练习ArrayList 集合、Iterator 迭代器、foreach循环、HashSet的使用。

本联系的题目有: 一、有 2 个 ArrayList,元素如下: array1 = "a","b","a","c","d",array2="e","f","a","d","g",将两个集合重复项去除后合并成一个集合,并输出集合中的元素。 二、利用键盘录入,输入一个字符串,统计该字符串中各个字符的数量如 用 户 输 入 字 符 串 :"hello world java", 程 序 输出结果:h(1)e(1)l(3)o(2) (2)w(1)r(1)d(1)j(1)a(2)v(1)。

weixin_54354252的博客 1499

世界职业院校技能大赛财经赛道项目参考逐字稿五

世界职业院校技能大赛财经赛道项目参考逐字稿五

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 134

iterator在java_为什么我们需要在Java中使用ArrayList上的iterator?

参见英文答案 >Do we ever need to use Iterators on ArrayList?6个答案我正在阅读提到的问题的答案“Do we ever need to use Iterators on ArrayList?”。在答案中,用户表示如下:“...

weixin_29765215的博客 139

大模型之Spring AI实战系列(二十六):Spring Boot + DeepSeek 实战指南:构建AI聊天应用

在人工智能技术飞速发展的今天,大型语言模型已经成为了推动技术创新的重要力量。DeepSeek作为国内领先的大型语言模型提供商,其推出的DeepSeek系列模型在多个领域都展现出了卓越的性能。本文将详细介绍如何使用Spring Boot框架集成DeepSeek API,构建一个简单的AI聊天应用。我们将实现两个核心功能:普通文本生成和流式文本生成。

寻道AI,探索AI无限可能! 2264

torch_npu 用法笔记

torch_npu 用法笔记

jacke121的专栏 1536

深入理解ArrayList

什么是ArrayList? ArrayList的实现原理其实就是数组(动态数组),ArrayList的介绍及简单使用方法 动态数组与一般数组有什么区别? 与Java中的数组相比,ArrayList的容量能动态地增长 ArrayList效率怎么样? ArrayList不是线程安全的,所以效率比较高 ,但是只能用于单线程的环境中,那多线程呢?别急,文末会讲到 ArrayList主要继承哪些类实现了哪些...

Woo_home的博客 2万+

Android性能分析——hprof文件分析(一)

hprof  文件是 Java 堆转储文件(Heap Dump File)的标准格式,用于保存 Java 虚拟机(JVM)在某个时间点的内存快照。这种文件对于分析内存泄漏、内存使用情况和对象分配模式非常有用。

小旭的专栏 1878

深入理解ArrayList iterator remove

深入理解ArrayList iterator remove 我们都知道在list遍历中使用ArrayList.remove 是不安全的。会直接抛出运行时异常java.util.ConcurrentModificationException 具体是为什么呢? 通俗的来讲是因为list列表里面发生了index偏差,当你remove了一个元素,会影响整个list的长度,并且在获取下一元素的时候发生错误。...

qq_24075991的博客 1158

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Iterator迭代ArrayList

import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratList { public static void main(String[] args) { List list=new ArrayList(); list.add("1"); list.add("*"); list.add("2"); list.add("*"); list.add(

weixin_48495394的博客 178

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深入理解集合的迭代器 Iterator,为什么遍历数组时删除元素不能直接使用remove()方法而需要使用迭代器?

本文介绍了Java中Iterator迭代器的基本概念与使用方法。主要内容包括:1. Iterator接口的核心方法hasNext()和next()的作用;2. 通过ArrayList示例演示迭代器的创建与遍历过程;3. 使用迭代器时的注意事项:不会报索引越界异常、不会自动复位、每次循环只能调用一次next()方法、遍历时不能使用集合方法修改集合元素。文章重点解析了迭代器遍历时修改集合会抛出ConcurrentModificationException异常的底层原理(modCount机制)。

m0_70325779的博客 3014

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java ArrayList的Iterator源码解析

Iterator是一个非常重要的遍历List的工具,再利用迭代器进行增删改时,往往会产生意想不到的bug,因此我们从源码来理解一下ArrayList的Iterator实现。 rep private class Itr implements Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element retu

awake020 357

ArrayList源码解析之iterator,listIterator

ArrayList的遍历方式有多种,本文主要对Iterator、ListIterator两种迭代器的源码进行分析。 一、Iterator源码分析 public Iterator<E> iterator() { return new Itr(); } ArrayList的迭代器返回的是一个内部类Itr,接下来看看Itr的内容: private c...

PrimeYun的博客 347

Iterator与ListIterator及ArrayList、LinkedList中对其实现

Iterator与LinkedIterator Iterator与LinkedIterator分别是两个接口,LinkedIterator继承自Iterator接口,所以LinkedIterator会比Iterator多一些方法 Iterator的方法: boolean hasNext(); E next(); void remove(); ListIterator的方法: bool...

FANGHAOWEN_的博客 493

有关Iterator的一点看法

  本人是初学者,最近研究了一下Iterator,有了一点心得,就写下来,供以后参考。下面是我写的一个简单的类,用来研究Iterator用法的。(顺便也研究了一下ArrayList,这里我只是说一下Iterator) import java.util.ArrayList;import java.util.Iterator;import java.util.List;class Test4{   

J2EE_ME的专栏 1383

对于容器中迭代器iterator的理解

容器中Iterator方法的理解。 Iterator是JAVA容器中重要的一个方法,可以实现容器中的遍历。 我们以前实现数组的遍历是这样的 int arr[]={1,2,3,4,5}; for(int i=0; i<arr.length(); i++){ System.out.println(arr[i]+" "); } 那我们想要实现容器中的遍历就需要使用到Itera...

林主席的博客 489

java的 iterator方法_java iterator方法

展开全部iterator方法是JDK提供的迭代32313133353236313431303231363533e4b893e5b19e31333337393536接口进行Java集合的迭代。Iterator iterator = list.iterator();while(iterator.hasNext()){String string = iterator.next();//do someth...

weixin_34498545的博客 2777

通过ArrayList源码深入理解java中Iterator迭代器的实现原理

注意:本文将着重从源码的角度对Iterator的实现进行讲解,不讨论List与Iterator接口的具体使用方法。不过看懂源码后,使用也就不是什么问题了。 java中各种实现Iterator的类所具体使用的实现方法各不相同,但是都大同小异。因此本文将只通过ArrayList类源码进行分析。所以最好对ArrayList的源码有一定了解,或者至少具备相关的算法知识。 首先贴出ArrayList类中...

nayi_224的博客 2742

java iterator 源码_java的Iterator源码浅析

在java的集合中,List接口继承Collection接口,AbstractList类实现了List接口,在AbstractList中的内部类Itr实现了Iterator接口ArrayList实现List接口并继承AbstractList类,结构图如下:(图片出自网络)Iterator接口源码:public interface Iterator {boolean hasNext();E next...

weixin_36268255的博客 266

【Java每日面试题】Iterator迭代器到底是什么?

我们常使用 JDK 提供的迭代接口进行 Java 集合的迭代。 Iterator iterator = list.iterator(); while (iterator.hasNext()) { String string = iterator.next(); //do something } 迭代可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类。Iterator 模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型集合类中抽象出来,从而避免向客户端暴露集合内

JavaEdge全是干货的技术号 4200

为什么ArrayList的遍历中for比Iterator快,而LinkedList中却是Iterator远快于for?

ArrayList 是基于索引(index)的数组,索引在数组中搜索和读取数据的时间复杂度是O(1),ArrayList的get方法只是从数组里面拿一个位置上的元素即可。但是要增加和删除数据却是开销很大的,因为这需要重排数组中的所有数据。 LinkedList 的底层实现则是一个双向循环带头节点的链表,因此LinkedList中插入或删除的时间复杂度仅为O(1),但是获取数据的时间复杂度却是O(n)。 明白了两种List的区别之后,就知道,ArrayList用for循环随机读取的速度是很快的,因为Array

qq_43354492的博客 558
下一篇: 怎样在Eclipse中使用debug调试程序?
chenndd
博客等级 码龄17年 13粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值