详解 迭代器 —— Iterator接口、 ListIterator接口 与 并发修改异常
(请关注 本人“Collection集合”博文——《详解 Collection集合》)
Iterator接口(迭代器):
概述:
对 collection 进行迭代的迭代器
在我们现阶段的学习中,只需要理解这个接口所提供的三个方法即可:
- boolean hasNext()
如果仍有元素可以迭代,则返回 true。- E next()
返回迭代的下一个元素。- void remove()
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
现在,本人来通过一段代码来展示下迭代器的使用方法:
package com.youzg.about_iterator.core;
import java.util.*;
public class Test {
public static void main(String[] args) {
Collection arrayList = new ArrayList(); //由于ArrayList是Collection的实现类,所以我们可以这样去实例化一个Collection子类的对象
arrayList.add(1000);
arrayList.add(2000);
arrayList.add(3000);
arrayList.add(4000);
arrayList.add(5000);
arrayList.add(6000);
Iterator iterator = arrayList.iterator(); //我们必须通过这个方法得到迭代器,才能在之后通过迭代器遍历集合
System.out.println(iterator);
while (iterator.hasNext()) { //判断是否还有下一个元素
Object next = iterator.next(); //把指针狭义
System.out.println(next); //获取下一个元素
}
}
}
现在,本人来展示下运行结果:

下图是它的实现类和子接口:

Collection类有List类。
相应地,Iterator类也有ListIterator子类,
因为我们未来的编程对于List这个接口的使用比较频繁,所以,在这里,本人再来讲解一下有关ListIterator的知识点:
ListIterator接口:
- void add(E e)
将指定的元素插入列表(可选操作)。- boolean hasNext()
以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。- boolean hasPrevious()
如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。 E next()
返回列表中的下一个元素。- int nextIndex()
返回对 next 的后续调用所返回元素的索引。- E previous()
返回列表中的前一个元素。- int previousIndex()
返回对 previous 的后续调用所返回元素的索引。- void remove()
从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。- void set(E e)
用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。
因为比 Iterator接口 多了一些方法,所以,我们可以对于一个List进行反向遍历
那么,现在,本人通过一段代码来展示下:
package edu.youzg.about_collection.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
public class Test {
public static void main(String[] args) {
List arrayList = new ArrayList();
arrayList.add(1001);
arrayList.add(1002);
arrayList.add(1003);
arrayList.add(1004);
//正向迭代
ListIterator listIterator = arrayList.listIterator();
while (listIterator.hasNext()){
Object next = listIterator.next();
System.out.println(next);
}
System.out.println("===================");
//反向迭代:注意进行反向迭代器前,先进行正向迭代
// ListIterator listIterator2 = arrayList.listIterator();
while (listIterator.hasPrevious()){ //判断有没有上一个元素
Object previous = listIterator.previous(); //获取上一个元素
System.out.println(previous);
}
}
}
现在,本人来展示下运行结果:

讲到这里,相信同学们也差不多学会了该如何使用迭代器来遍历集合了,那么,现在本人来讲解一个非常常见的“异常”—— ConcurrentModificationException:
ConcurrentModificationException异常:
定义:
定义:
并发修改异常
出现原因:
出现原因:
我们的迭代依赖于集合, 当我们往集合中添加好了元素之后 获取迭代器 那么迭代器已经知道了集合的元素个数
这个时候你在遍历的时候又突然想给 集合里面增、删、改元素(用的是集合的add方法),就会与已生成的迭代器对于数量的记录产生冲突,就会报异常
解决方法:
解决方法:
用ListIterator迭代器遍历 用迭代器自带的add、remove、set方法添加元素 那就不会报错了
(Collection链接:https:////www.cnblogs.com/codderYouzg/p/12416566.html)
(集合总集篇链接:https://www.cnblogs.com/codderYouzg/p/12416560.html)
详解 迭代器 —— Iterator接口、 ListIterator接口 与 并发修改异常的更多相关文章
- Java API —— List接口&ListIterator接口
1.List接口概述 有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索 ...
- java-Collection集合、List集合、Vector集合和迭代器Iterator、ListIterator的使用
1.对象数组的概述和使用 * A:案例演示 * 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. * Student[] arr = new Student ...
- 日历类和日期类转换 并发修改异常 泛型的好处 *各种排序 成员和局部变量 接口和抽象类 多态 new对象内存中的变化
day07 ==和equals的区别? ==用于比较两个数值 或者地址值是否相同. equals 用于比较两个对象的内容是否相同 String,StringBuffer.StringBuilde ...
- Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- 集合框架之——迭代器并发修改异常ConcurrentModificationException
问题: 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. 使用普通迭代器出现的异常: ...
- Java基础知识强化之集合框架笔记19:List集合迭代器使用之 并发修改异常的产生原因 以及 解决方案
1. 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. ConcurrentModi ...
- 大杂烩 -- Iterator 并发修改异常ConcurrentModificationException
基础大杂烩 -- 目录 大杂烩 -- Java中Iterator的fast-fail分析 大杂烩 -- Iterator 和 Iterable 区别和联系 问题: 在集合中,判断里面有没有" ...
- 集合--Collection接口详解&&迭代器
/* * 集合的顶层接口--Collection接口 * 添加 * add() * addAll() * * 遍历集合 * iterator() 迭代器 * * 删除 * remove() * rem ...
- 【Java入门提高篇】Day20 Java容器类详解(三)List接口
今天要说的是Collection族长下的三名大将之一,List,Set,Queue中的List,它们都继承自Collection接口,所以Collection接口的所有操作,它们自然也是有的. Lis ...
随机推荐
- Android初级控件
Android初级控件 从今天开始就对Android进行正式的学习,首先先来学习一下初级的控件 1.TextView 文本框,用于显示文字,不可编辑. 常用属性 android:autoLink ...
- OpenCV-Python 图像梯度 | 十八
目标 在本章中,我们将学习: 查找图像梯度,边缘等 我们将看到以下函数:cv.Sobel(),cv.Scharr(),cv.Laplacian()等 理论 OpenCV提供三种类型的梯度滤波器或高通滤 ...
- 机器学习算法系列:FM分解机
在线性回归中,是假设每个特征之间独立的,也即是线性回归模型是无法捕获特征之间的关系.为了捕捉特征之间的关系,便有了FM分解机的出现了.FM分解机是在线性回归的基础上加上了交叉特征,通过学习交叉特征的权 ...
- python之常用模块ymal
在学习python如何操作yml文件之前,我们先科普一下yml的格式 yaml是专门写配置文件的语言,非常简洁和强大,比json更加方便 YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便 ...
- 数据库(sqlserver 2005)优化排查之路
查找问题过程是痛苦的,解决完问题是快乐! 兄弟帮助一个公司开发了一个旅游网站(asp.net+sqlsever2005),一直还算稳定,但是最近网站却慢的可以,让人头疼.登录服务器,进入任务管理器,发 ...
- Jmeter 注册用户获取登录token值
1. 打开jemeter,新建一个测试计划,>线程组 >新建一个 登录的 Http 请求. 2.填上相应的值 3.新建一个消息头管理器> content-Type applicat ...
- iOS 构建动态库
一.构建步骤 创建一个动态库 MyDynamicFramework 创建一个测试类 在 MyDynamicFramework.h(默认生成,可统一暴露头文件) 中 #import "Pers ...
- python中的可变和不可变对象 有序和无序对象
可变对象和不可变对象的定义:对象存放在地址的值是否可以被改变 不可变对象包括:整形int.浮点型float .字符串str .元祖tuple.布尔型boole 可变对象包括 :列表list.集合set ...
- 《深入理解 Java 虚拟机》读书笔记:线程安全与锁优化
正文 一.线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那 ...
- JavaScript 进阶入门
17:56:11 2019-08-09 如题所见 还是入门 23:10:17 2019-08-11 继续学习 16:34:59 2019-08-14 虽然入了门 但还是缺少实践 本文资料来源: 慕课网 ...