列表迭代器:

  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. Cocos Creator实现左右跳游戏,提供完整游戏代码工程

    ​1. 玩法说明 游戏开始后,点击屏幕左右两侧,机器人朝左上方或右上方跳一步,如果下一步有石块,成功得1分,否则游戏结束. 2. 模块介绍 游戏场景分为2个:主页场景(home).游戏场景(game) ...

  2. MySQL 和 Navicat Premium 下载及安装全过程

    前言: 我对 “MySQL社区版” 的理解是:它只是一个后台服务,它的管理需要用到其他的数据库管理软件,这里我用的是 Navicat Premium,这个软件可以同时为多个数据库提供管理,比如MySQ ...

  3. Numpy数组解惑

    参考: 理解numpy的rollaxis与swapaxes函数:https://blog.csdn.net/liaoyuecai/article/details/80193996 Numpy数组解惑: ...

  4. .netCore+Vue 搭建的简捷开发框架--目录

    .netCore+Vue 搭建的简捷开发框架 .netCore+Vue 搭建的简捷开发框架 (2)--仓储层实现和EFCore 的使用 .netCore+Vue 搭建的简捷开发框架 (3)-- Ser ...

  5. Maven插件构建Docker镜像

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...

  6. X-扫描线算法

    多边形的扫描转换 多边形有两种重要的表示方法:顶点表示和点阵表示 顶点表示是用多边形的顶点序列来表示多边形.这种表示直观.几何意义强.占内存少,易于进行几何变换. 但由于它没有明确指出哪些象素在多边形 ...

  7. Attention机制全解

    前言 之前已经提到过好几次Attention的应用,但还未对Attention机制进行系统的介绍,之后的实践模型attention将会用到很多,因此这里对attention机制做一个总结. Seq2S ...

  8. shark恒破解笔记2-绕过自校验

    这集讲的是绕过自校验 主要是通过文件大小的自校验 首先查壳 有壳  可以用esp定律搞定 OD载入  右键od脱裤壳调试进程 可以看到一些信息 包括入口点252F0 修正后地址为252F0 loadP ...

  9. 当前机器的各种进程、服务信息的收集(win)

    当前机器的各种进程.服务信息的收集(win) 前言 我们在做渗透测试的过程中,遇到Windows系统的环境是最多的,然而在拿到一台Windows胸膛呢权限之后,我们要进行横向渗透测试或者纵向渗透测试, ...

  10. [Luogu3065][USACO12DEC]第一!First!

    题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...