列表迭代器:

  ListIterator listerator():List集合特有的迭代器

  该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法

特有功能:

  Object previous();获取上一个元素

  boolean hasPrevious():判断是否有元素

  注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用

 package com.wyh.Iterator;

 import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator; /**
* @author WYH
* @version 2019年11月9日 下午7:31:41
*
* ListIterator : List集合特有的迭代器
*
*/
public class ListIteratorDemo1 {
public static void main(String[] args) {
//创建集合
List i = new ArrayList(); //创建字符串对象并将其添加到集合中
i.add("王友虎");
i.add("李宏灿");
i.add("赵以浩");
i.add("齐博源");
i.add("李先锋"); //ListIterator 继承了 Iterator,所以可以用它的实现
Iterator it = i.iterator();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}
System.out.println("----------------------"); // previous()逆向打印
ListIterator list = i.listIterator();
/*//如果逆向打印处于第一个位置,输出为空
* System.out.println("------------逆向打印------------------");
while(list.hasPrevious()) {
String s3 = (String)list.previous();
System.out.println(s3);
}*/
while(list.hasNext()) {
String s2 = (String)list.next();
System.out.println(s2);
}
System.out.println("------------逆向打印------------------");
while(list.hasPrevious()) {
String s3 = (String)list.previous();
System.out.println(s3);
} } }

一个十分重要出现问题的点,也是面试经常会问到的点。并发修改错误。

问题: 我有一个集合,如下,请问,我想判断里面有没有"李宏灿"这个元素,如果有,我就添加一个元素到集合中,请写代码实现。

于是大部分人不知道这个并发修改错误的时候,会按照自己的逻辑按照以下代码实现:

  /*//创建迭代器(Iterator迭代器)(错误示范-----------------)
Iterator it = list.iterator();
//找到元素并进行添加张国兴
while(it.hasNext()) {
String s = (String)it.next();
if("李宏灿".equals(s)) {
list.add("123");
}
}
System.out.println("list:"+list);*/

结果,我们发现报错,可是我们的逻辑是没有错的,那到底错在哪呢?(报错:并发修改异常:ConcurrentModificationException

产生的原因:

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

如何解决呢:

  A: 迭代器迭代元素,迭代器修改元素,我们使用List集合特有的迭代器:ListIterator listerator()

    结果:元素是跟在刚才迭代查找到的元素的后面

  B:集合遍历元素,集合修改元素(普通的for循环实现)

    结果:在末尾进行添加

代码实现:

 package com.wyh.Iterator;

 import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator; /**
* @author WYH
* @version 2019年11月9日 下午7:51:26
*
* 并发修改异常:ConcurrentModificationException
*
*/
public class ListIteratorDemo2 {
public static void main(String[] args) {
//创建集合对象
List list = new ArrayList(); //创建字符串对象并将其添加到集合中去
list.add("王友虎");
list.add("李宏灿");
list.add("赵以浩");
list.add("齐博源");
list.add("李先锋"); /*//创建迭代器(Iterator迭代器)(错误示范-----------------)
Iterator it = list.iterator();
//找到元素并进行添加张国兴
while(it.hasNext()) {
String s = (String)it.next();
if("李宏灿".equals(s)) {
list.add("123");
}
}
System.out.println("list:"+list);*/ //方法1:创建ListIterator迭代器,迭代器调用add方法进行添加
ListIterator listt = list.listIterator();
while(listt.hasNext()) {
String s = (String)listt.next();
if("李宏灿".equals(s)) {
listt.add("张国兴"); //在找到的元素后面进行添加
}
}
System.out.println("list:"+list); //方法2:利用for循环直接对集合进行遍历,集合中有添加的方法
for(int i = 0;i<list.size();i++) {
String s = (String)list.get(i);
if(s.equals("李宏灿")) {
list.add("张果喜"); //在末尾进行添加
}
}
System.out.println("list:"+list); } }

大数据之路week01--自学之集合_2(列表迭代器 ListIterator)的更多相关文章

  1. 大数据之路week01--自学之集合_2(Iterator迭代器)

    选代器:是遍历集合的一种方式.迭代器是依赖于集合而存在的.我有一个集合: Collection c = new ArrayList();我们给集合中添加元素: c. add("hello' ...

  2. 大数据之路week01--自学之集合_2(List)

    在学习过了Collection之后,接下来我们将去学习List, 先看API文档: List集合的特有功能:(没有列出Collection也有的功能) A:添加功能  add(int index, E ...

  3. 大数据之路week01--自学之集合_1(Collection)

    经过我个人的调查,发现,在今后的大数据道路上,集合.线程.网络编程变得尤为重要,为什么? 因为大数据大数据,我们必然要对数据进行处理,而这些数据往往是以集合形式存放,掌握对集合的操作非常重要. 在学习 ...

  4. 大数据之路week01--day02_2 集合方面的总结

    (初稿 太晚了,明天再进行补充) 1.对象数组(掌握) (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组. (2)案例: 用数组存储5个学生对象,并遍历数组 ...

  5. 大数据之路week04--day06(I/O流阶段一 之异常)

    从这节开始,进入对I/O流的系统学习,I/O流在往后大数据的学习道路上尤为重要!!!极为重要,必须要提起重视,它与集合,多线程,网络编程,可以说在往后学习或者是工作上,起到一个基石的作用,没了地基,房 ...

  6. 大数据之路week04--day03(网络编程)

    哎,怎么感觉自己变得懒了起来,更新博客的频率变得慢了起来,可能是因为最近得知识开始变得杂变得难了起来,之前在上课的时候,也没有好好听这一方面的知识,所以,现在可以说是在学的新的知识,要先去把新的知识思 ...

  7. 胖子哥的大数据之路(9)-数据仓库金融行业数据逻辑模型FS-LDM

    引言: 大数据不是海市蜃楼,万丈高楼平地起只是意淫,大数据发展还要从点滴做起,基于大数据构建国家级.行业级数据中心的项目会越来越多,大数据只是技术,而非解决方案,同样面临数据组织模式,数据逻辑模式的问 ...

  8. 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍

    引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文:  The NoSQL Ecosystem 目录 The NoSQL Eco ...

  9. 大数据之路day01_1--Java下载、安装等配置

    从今天开始,我就正式的走上大数据的道路了,如果说我为啥要去学习大数据,可能我的初衷是以后可以接触到人工智能方面的技术,后来在自学的过程中发现,学习人工智能,需要扎实的算法,以及对大量数据的处理,再者, ...

随机推荐

  1. C#的FTP服务器源代码

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. Java Intellij 第一个HelloWord

    前言 最近重心点都在Java, 鉴于避免一些跟我一样学习Java开始啥都不懂,不知如何下手,方便小白快速入门.故写下此文,鉴于分享. (前提是安装jdk, 建议使用版本是1.8) JDK 安装地址:h ...

  3. GUI tkinter (bind)事件篇

    """事件:1.我们的很多操作,比如我们点击了一下鼠标,这就是一 个事件,而操作系统会根据我们的相应的事件产生相应的消息, 操作系统把消息传递给我们的应用程序,然后我们的 ...

  4. Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持

    之前 Spring Boot 2.2没能按时发布,是由于 Spring Framework 5.2 的发布受阻而推迟.这次随着 Spring Framework 5.2.0 成功发布之后,Spring ...

  5. Python函数参数与参数解构

    1 Python中的函数 函数,从数学的角度来讲是,输入一个参数,经过一个表达式的处理后得到一个结果的输出,即就是x-->y的一个映射.同样,在Python或者任何编程语言中,函数其实就是实现一 ...

  6. Java的IO操作之关闭流

    我们知道,当结束对一个流的操作时,需要调用流的close()方法对其进行释放,这将释放掉与这个流有关的所有资源,包括文件句柄.端口等.如果不关闭流,垃圾回收机制将无法识别你是否已使用完这个文件,读取的 ...

  7. C#用抽象类定义几何图形

    using System;/*using System.Data;*/namespace tx{    abstract class tx    {        public double chan ...

  8. Mybatis入门简版(二)

    一.Dao层开发的方式 以前dao层开发比较繁琐,写了接口还得写实现类,实际上用了Mybatis之后写实现类非常重复,都是重复的代码.那么此时改成另外一种简单形式. 遵循以下四个原则(名称.形参.返回 ...

  9. git操作指令,以及常规git代码操作

    安装git后操作指令如下:可以查阅git安装使用操作指南详情git安装使用操作图示详情.note 线上可参考指南:http://www.bootcss.com/p/git-guide/   所有操作在 ...

  10. windows进程中的内存结构(缓冲溢出原理)

    接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论.下文中的C语言代码如没有特别声明,默认都使 ...