详解 迭代器 —— 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 ...
随机推荐
- xgboost安装与原理
1.xgboost库的安装 先在网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 中下载whl文件,注意一定要下载跟自己当前安装Python版 ...
- 近期 github 机器学习热门项目 top5
欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 作者:Walker No1:NVIDIA's vid2vid Technique( ...
- coding++:java-全局异常处理
本次使用工具:SpringBoot <version>1.5.19.RELEASE</version> Code: AbstractException: package m ...
- iOS 预渲染加速图像显示
使用 UITableView 时,发现滚动时的性能还不错,但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感. 于是猜想显示过的图像肯定是被缓存起来了,查了下文档后发现果然如 ...
- iOS MachO
一.前言 1.1 程序和进程 广义上的程序就是一个静态的可执行文件,是由一个已经编译好的指令和数据集合的一个文件.就像通过 Xcode 编译好的 Mach-O 文件.而进程则是一个动态的概念,是程序的 ...
- spring boot 源码赏析之事件监听
使用spring Boot已经快1年多了,期间一直想点开springboot源码查看,但由于种种原因一直未能如愿(主要是人类的惰性...),今天就拿springboot 的监听事件祭刀. spring ...
- elasticsearch异常问题 discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
本文使用环境 centos7.x elasticsearch7.6.2 JDK1.8 错误:文件权限不足 [1]: max file descriptors [4096] for ...
- Python学习前端之JavaScript
JavaScript介绍 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客户端执行的语言). Nets ...
- CTR学习笔记&代码实现2-深度ctr模型 MLP->Wide&Deep
背景 这一篇我们从基础的深度ctr模型谈起.我很喜欢Wide&Deep的框架感觉之后很多改进都可以纳入这个框架中.Wide负责样本中出现的频繁项挖掘,Deep负责样本中未出现的特征泛化.而后续 ...
- B 【ZJOI2007】时态同步
时间限制 : - MS 空间限制 : 265536 KB 评测说明 : 1s 256m 问题描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 ...