如何有效的使用 for循环和Iterator遍历

遍历ArrayList
使用for循环遍历的速度会比Iterator遍历的速度要快:

for (int i=0, n=list.size(); i < n; i++)list.get(i);runs faster than this loop:for (Iterator i=list.iterator(); i.hasNext();)i.next();

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

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

1、iterator
迭代器遍历方式, 适用于连续内存存储方式,比如数组、 ArrayList(其实 ArrayList底层实现也是数组形式)。 缺点是只能从头开始遍历, 优点是可以边遍历边删除。
例如:

Iterator iter = list.iterator();
while(iter.hasNext()){Object o = iter.next();if(o.equals("a")){iter.remove();
}

2、for list.size方式遍历
这种方式遍历比较灵活,可以指定位置开始遍历。性能最高,但是使用不太优雅,每次都需要在应用程序中手动强转和额外的获得list.size,这样就会导致产生额外的代码。
基于for方式的遍历,还有一个缺点就是遍历过程中不允许删除元素,否则会抛ConcurrentModificationException。 如下:

ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//list.remove(1);
Iterator iter = list.iterator();
for(String s:list){if(s.equals("b")){list.remove(s);}
}

为什么用iterator删除元素不抛异常,而用for删除会抛异常呢?
这主要是因为arraylist每次遍历的时候会去判断该集合是否被修改过,调用的方法是checkForComodification()。
如果被修改过ConcurrentModificationException异常。
如何判断是否修改呢,主要是通过维护2个变量来实现,modCount记录了修改次数,expectedModCount记录期望修改次数。
通过iterator.remove()进行的删除操作,会同时修改modCount、ConcurrentModificationException;
而通过list.remove(object/index),则只会修改modCount。 这也是fast-fail机制。

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

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

相关文章

【js】数组置空的其他方式及使用场景

数组在js中属于引用型类型。 var arr [1, 2, 3]; a []; 通常使用以上方式。如果使用场景必须使用方法置空&#xff0c; 可以采用arr.length 0; 或者使用a.splice(0, a.length); 使用场景 vue2中组定义组件中v-model的值是数组类型&#xff0c; 组件内部需要清空时&#xff0…

Postgresql 填充所有的时间点

最近使用有个业务需要展示20190101和20190106所有的时间段&#xff0c;例如 20190101 20190102 20190103 20190104 20190105 20190106但是数据库中存的只有以下 20190101 20190102 20190104 20190106那我们需要把20190103、20190105填充进去。 方式一&#xff1a; 新建个存储…

分类与监督学习,朴素贝叶斯分类算法

1.理解分类与监督学习、聚类与无监督学习。 &#xff08;1&#xff09;简述分类与聚类的联系与区别。 分类就是按照某种标准给对象贴标签&#xff0c;再根据标签来区分归类。聚类是指事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程。 区别是&#xff0c…

Postgre合并多行数据为一行

业务情景描述&#xff1a;用户需要一行展示所有的文件名称&#xff0c; 比如&#xff1a;你的1.txt、2.txt、3.txt未上传成功&#xff0c;请核查&#xff01; SELECT * FROM fileTable --查询结果如下&#xff1a; 1.txt 2.txt 3.txt方式一&#xff1a;使用string_agg函数&…

如何学好Spring

要学好Spring&#xff0c;首先要明确Spring是个什么东西&#xff0c;能帮我们做些什么事情&#xff0c;知道了这些然后做个简单的例子&#xff0c;这样就基本知道怎么使用Spring了。Spring核心是IoC容器&#xff0c;所以一定要透彻理解什么是IoC容器&#xff0c;以及如何配置及…

数据库查询字段为空时,返回0

oracle select nvl(字段名,0) from 表名; sqlserver select isnull(字段名,0) from 表名; mysql select ifnull(字段名,0) from 表名; postgresql select coalesce(字段名,0) from 表名;

一张图搞定OAuth2.0

转发&#xff1a;https://www.cnblogs.com/flashsun/p/7424071.html 目录 1、引言2、OAuth2.0是什么3、OAuth2.0怎么写1、引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式&#xff1a;授权码模式 非常简单的一件事情&#xff0c;网上一堆神乎其神的讲解&#xff0c;让…

insert select 过滤掉重复数据

INSERT INTO SELECT 语句从一个表复制数据&#xff0c;然后把数据插入到一个已存在的表中。 table1和table2表结构一样时&#xff1a; INSERT INTO table2 SELECT * FROM table1;table1和table2表结构不一样时&#xff1a; INSERT INTO table2(field1,field2,field3) SELECT …

jdbc连接sqlserver,mysql,oracle

class xxx{private static String port "1433";private static String ip "192.168.2.163";//mysql : jdbc:mysql:////sqlserver : jdbc:sqlserver// 或者 jdbc:microsoft:sqlserver://private static String driverType "jdbc:sqlserver://&qu…

extjs展示列表,显示来很多空白行,但是数据没显示

检查&#xff1a; mysql查询是没有大小写问题 sql返回的字段大小写问题 Map<String, Object> result new hashmap<String, Object>();创建的map、key是有大小写区分 Map<String, Object> result new CaseInsensitiveMap(); 中的key是没大小写区分 最后…

linux部署redis详细步骤

公司一直在使用redis集群&#xff0c;寻思着自己也部署一套练练手。 打开redis的官网下载页&#xff1a;https://redis.io/download 按照官网的步骤进行操作&#xff1a; 你会发现输入src/redis-cli命令之后&#xff0c;一直连接不上。 提示信息&#xff1a;Could not connect …

四则运算 结对项目

github 地址:https://github.com/wangshicheng0213/HomeWork02 一、基本要求 1) 实现一个带有用户界面的四则运算。 2) 生成的题目不能重复。 3) 支持负数&#xff0c;例如-1&#xff0c;-1/2&#xff0c;-3‘4/5等。 4) 题目的数量&#xff08;个人项目的要求&#xff09; 5) …

linux部署redis集群遇到的问题

版本信息&#xff1a; redis&#xff1a;5.0.8 linux服务器&#xff1a;CentOS 7 不同版本问题处理方式可能有所不同 1、在java程序中&#xff0c;连接不上redisCluster。 报错信息&#xff1a; no reachable node in cluster 原因&#xff1a;创建集群时&#xff0c;使用了127…

大型数据库

over&#xff08;order by salary&#xff09; 按照salary排序进行累计&#xff0c;order by是个默认的开窗函数 over&#xff08;partition by deptno&#xff09;按照部门分区 如何使用Oracle Round 函数 (四舍五入)描述 : 传回一个数值&#xff0c;该数值是按照指定的小数位…

mysql服务自动关闭的解决

笔记本上设置成合上板子不休眠&#xff0c;于是干脆把笔记本放在书包里面&#xff0c;通过远程桌面连接笔记本电脑&#xff0c;经过了很长的时间&#xff0c;再去连接数据库&#xff0c;结果出现cann’t connect 10061错误&#xff0c;发现原来是MySQL服务不知怎么的就关闭了&a…

thinkPHP 数据库操作和分页类

转载于:https://www.cnblogs.com/finddata/p/10013962.html

RHCE基础环境系统的搭建

RHCE基础环境系统的搭建 安装前提&#xff1a; 安装的时候对系统和硬件的要求&#xff1a; 红帽系统安装队系统的要求&#xff1a;Windows操作系统选择64位的内存至少6GCPU需要支持虚拟化技术在做红帽系统实验的时候&#xff0c;把360类似这样的杀毒或是管家软件退出了&#xf…

Chrome Extension Dark Theme

Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhnkhdbieeh https://github.com/darkreader/darkreader https://github.com/xyz-data/darkreader 转载于:https://www.cnblogs.com/xgqfrms/p/10017780.html

安装版win7安装时分区

先创建一个主分区&#xff0c;用于安装系统然后按下 ShiftF10 启动命令窗口&#xff0c;输入如下命令输入 diskpart 并回车list disk //显示所有硬盘select disk 0 //选择你的硬盘create partition extended //把剩下的…

mybatis 控制台打印执行的SQL语句

1. Spring boot 集成 mybatis 【转载】SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件&#xff0c;加入如下配置&#xff1a; 1 logging.level.com.example.demo.daodebug 红色部分指的是mybatis对应的方法接口所在的包路径。 1.2 如果使用的是appli…