集合之二:迭代器

迭代器的简单使用

  在遍历容器时,我们可以使用for循环或者是增强for循环,但是不同的集合结构在遍历时,我们要针对集合特点采取不同的方式,比如List是链表,我们可以直接当做数组处理,但Map是Key—Value的形式,我们只有获取了键名才能去遍历集合内容。

  很麻烦对吧?

  还好JDK为我们提供了一个接口-------Iterator(迭代器),迭代器为各种容器提供了公共的操作接口。这样使得对容器的遍历操作与其具体的底层实现相隔离,达到解耦的效果。

  查看Iterator的API我们得知,该接口共有3个方法

 

       查看API发现Collection实现了该接口,也就是说Collection的所有子实现类可使用Iterator的方法,同时在Collection中定义了一个方法iterator()

 

  使用该方法iterator(),要求容器返回一个Iterator对象。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

  那我们如何使用迭代器呢?

  示例代码如下,关键代码的解释说明已经在注释部分给出,将不再做赘述。

 

示例代码:

 1        /**
 2 
 3         * + VX:java8733 获取更多资源
 4 
 5  */
 6 
 7 public class TestIterator {
 8 
 9    
10 
11     public static void main(String[] args) {
12 
13        List<String> list= new ArrayList();
14 
15        list.add("and");
16 
17        list.add("try");
18 
19        list.add("your");
20 
21        list.add("best");
22 
23       
24 
25        //使用迭代器,对集合Arraylist中的元素进行取出
26 
27        //调用集合的方法iterator() 获取Iterator接口的实现类对象()
28 
29        Iterator<String> it=list.iterator();
30 
31        System.out.println(list.iterator().getClass());//打印的内容是 class java.util.ArrayList$Itr 既是我们的接口的实现类对象
32 
33         //接口实现类对象,调用方法hasNext()判断集合中是否有元素
34 
35         boolean b = it.hasNext();
36 
37         System.out.println(b);
38 
39         //接口的实现类对象,调用方法next()取出集合中的元素
40 
41         String s = it.next();
42 
43         System.out.println("it.next()"+s);
44 
45        while(it.hasNext()){
46 
47            /*
48 
49             * 这里将不会输出"and",因为我们调用一次hasNext,内部的指针就会指向下一个元素
50 
51             */
52 
53            System.out.println(it.next());
54 
55        }
56 
57       
58 
59     }
60 
61    
62 
63 }
64 
65  

 

会遇到的问题(并发修改异常) 

  我们来设想如下的场景: 在list集合迭代元素中,对元素进行判断,一旦条件满足就添加一个新元素。代码如下

 1   /**
 2 
 3         * + VX:java8733 获取更多资源
 4 
 5  */
 6 
 7  
 8 
 9     List<String> list2 = new ArrayList<String>();
10 
11        list2.add("abc");
12 
13        list2.add("def");
14 
15        list2.add("g");
16 
17       
18 
19        Iterator<String> it=list2.iterator();
20 
21        while(it.hasNext()){
22 
23            String str=it.next();
24 
25            if("g".equals(str)){
26 
27               //该操作会导致程序异常: ConcurrentModificationException
28 
29               List2.add("b");
30 
31            }
32 
33        }
34 
35        System.out.println(list2);

 


  这是为什么呢?我们会发现当我们使用迭代器遍历元素的时候, 使用了集合方法修改了集合的长度,这是不允许的。程序抛出异常ConcurrentModificationException,这个异常指的是当方法检测到对象的并发修改,但不允许这种修改时,就会抛出此异常。

      迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。

  那我们应该如何解决呢?

  首先,在迭代时,尽量不要使用集合的方法操作元素。如果要在迭代时对元素操作。我们可以通过ListIterator迭代器来操作元素。

  将上面的代码做如下的修改:

 

 

 1  /**
 2 
 3         * + VX:java8733 获取更多资源
 4 
 5  */
 6 
 7  
 8 
 9 ListIterator<String> it=list2.listIterator();
10 
11        while(it.hasNext()){
12 
13            String str=it.next();
14 
15            if("a".equals(str)){
16 
17               //子接口ListIterator包含add()方法
18 
19               it.add("b");
20 
21            }
22 
23        }

 

  

转载于:https://www.cnblogs.com/lotus-wmm/p/8318129.html

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

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

相关文章

简单使用ansible-playbook

1.使用以下命令给客户端安装httpd服务&#xff1a; [rootserver ~]# ansible testhost -m yum -a "namehttpd" 192.168.77.128 | SUCCESS > {"changed": true, "msg": "", "rc": 0, "results": ["Loaded …

原则

昨天例会上&#xff0c;领导分享了他最近看过的一本书《原则》。试想&#xff0c;工作上&#xff0c;生活中我的原则是什么呢&#xff1f;关于技术学习的原则。一开始的时候&#xff0c;一般都是遇到不会的再去学习&#xff0c;我一直比较喜欢带着问题&#xff0c;这样会学习效…

Python内置函数简记

一、数学运算类 abs(x)求绝对值 1、参数可以是整型&#xff0c;也可以是复数 2、若参数是复数&#xff0c;则返回复数的模complex([real[, imag]])创建一个复数divmod(a, b)分别取商和余数 注意&#xff1a;整型、浮点型都可以float([x])将一个字符串或数转换为浮点数。如果无参…

开源Java反编译工具

Java 反编译器 1. JD-GUI JD-GUI 是一个用 C 开发的 Java 反编译工具&#xff0c;由 Pavel Kouznetsov开发&#xff0c;支持Windows、Linux和苹果Mac Os三个平台。 而且提供了Eclipse平台下的插件JD-Eclipse。JD-GUI不需要安装&#xff0c;直接点击运行&#xff0c;可以反编译j…

基于MPI的H.264并行编码代码移植与优化

2010 03 25基于MPI的H.264并行编码代码移植与优化范 文洛阳理工学院计算机信息工程系 洛阳 471023摘 要 H.264获得出色压缩效果和质量的代价是压缩编码算法复杂度的增加。为了寻求更高的编码速度&#xff0c;集群并行计算被运用到H.264的视频编码计算中。分析H.264可实现并行计…

python自动取款机程序_python ATM取款机----运维开发初学(上篇)

自动取款机基本功能&#xff1a;可以存取转账&#xff0c;刷卡信息查询&#xff0c;银行卡号历史信息查询&#xff0c;消费记录查询&#xff0c;修改密码。思维导图如下&#xff1a;数据库设计&#xff1a;mysql> desc balan_list; #保存账号交易记录option_type-----------…

java的运行参数

贴个java的运行参数&#xff1a; Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -client to select the "client" VM -server to select t…

阿里服务器+Centos7.4+Tomcat+JDK部署

适用对象 本文档介绍如何使用一台基本配置的云服务器 ECS 实例部署 Java web 项目。适用于刚开始使用阿里云进行建站的个人用户。 配置要求 这里列出的软件版本仅代表写作本文档使用的版本。操作时&#xff0c;请您以实际软件版本为准。 操作系统&#xff1a;CentOS 7.4Tomcat …

php输出mysqli查询出来的结果

php连接mysql我有文章已经写过了&#xff0c;这篇文章主要是介绍从mysql中查询出结果之后怎么输出的问题。 一&#xff1a;mysqli_fetch_row(); 查询结果&#xff1a;array([0]>小王) 查询&#xff1a; [php] view plaincopy while ($row mysqli_fetch_assoc($result)) …

rhel mysql安装_RHEL6.4下MySQL安装方法及简单配置

1.MySQL安装方法简介 1.rpm包yum安装 2.通用二进制包安装 3.源码编译安装 注意&#xff1a;实验所采用的系统平台为&#xff1a;RHEL6.4 2.rpm ins首页 → 数据库技术背景&#xff1a;阅读新闻RHEL6.4下MySQL安装方法及简单配置[日期&#xff1a;2014-04-08]来源&#xff1a;Li…

H.264算法的DSP移植与优化

摘要&#xff1a;在TMS320DM643平台上实现H&#xff0e;264基档次编码器的移植与优化显得格外实用和必要。基于对DSP平台的结构特性和H&#xff0e;264的计算复杂度分析&#xff0c;主要从核心算法、数据传输和存储器&#xff0f;Cache使用几方面对H&#xff0e;264编码器进行了…

IDA*与A*

我实在懒得写博客了&#xff0c;直接放上来之前讲课做的的PPT得了。 PPT_Source Code.zip 转载于:https://www.cnblogs.com/zzzc18/p/8323927.html

java 子类 父类 转换_Java子类与父类之间的类型转换

1.向上转换父类的引用变量指向子类变量时&#xff0c;子类对象向父类对象向上转换。从子类向父类的转换不需要什么限制&#xff0c;只需直接蒋子类实例赋值给父类变量即可&#xff0c;这也是Java中多态的实现机制。2.向下转换在父类变量调用子类特有的、不是从父类继承来的方法…

H.264视频编解码的代码移植和优化

基于DSP系统开发的视频编解码系统&#xff0c;国内几乎都是走的移植&#xff0c;优化的路线&#xff0c;并且移植的代码&#xff0c;都是开源的。毕竟花费大量的人力&#xff0c;物力去开发一套自己的代码&#xff0c;并不见得比一些成熟的开源代码效率更高&#xff0c;健壮性更…

SublimeText2 快捷键

SublimeText2 快捷键&#xff0c;与对应功能一览表&#xff1a; 快捷键功能ctrlshiftn打开新Sublimectrlshiftw关闭Sublime&#xff0c;关闭所有打开文件ctrlshiftt重新打开最近关闭文件ctrln新建文件ctrls保存ctrlshifts另存为ctrlf4关闭文件ctrlw关闭ctrlk, ctrlb切换侧边栏显…

java-linux-eclipse配置

转载于:https://www.cnblogs.com/sheying/p/8327517.html

n皇后问题java_经典n皇后问题java代码实现

问题描述&#xff1a;在n*n的二维表格&#xff0c;把n个皇后在表格上&#xff0c;要求同一行、同一列或同一斜线上不能有2个以上的皇后。例如八皇后有92种解决方案&#xff0c;五皇后有10种解决方案。public class TestQueen {int n; //皇后的个数int num 0; // 记录方案数int…

ffmpeg mplayer x264 代码重点详解 详细分析

ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((ab1)>>1) #define avg4(a,b,c,d) ((abcd2)>>2) 显而易见&#xff0e;&#xff0e;&#xff0e;&#xff0c;注意a&#xff0c;b宏表达式可能引出的副作用 2 SIMD by software…

nagios监控服务器的搭建

nagios 概述&#xff1a; 开源的免费的网络监视工具。 监控&#xff1a; windows, Linux,Unix,交换机和路由器。报警。 Nagios是插件式的结构&#xff0c;它本身没有任何监控功能&#xff0c;所有的监控都是通过插件进行的&#xff0c;因此其是高度模块化和富于弹性的。Nagios…

BZOJ1031: [JSOI2007]字符加密Cipher

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7882 Solved: 3425[Submit][Status][Discuss]Description 喜欢钻研问题的JS同学&#xff0c;最近又迷上了对加密方法的思考。一天&#xff0c;他突然想出了一种他认为是终极的加密办法&#…