详解 迭代器 —— 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 ...
随机推荐
- OpenCV-Python BRIEF(二进制的鲁棒独立基本特征) | 四十二
目标 在本章中,我们将看到BRIEF算法的基础知识 理论 我们知道SIFT使用128维矢量作为描述符.由于它使用浮点数,因此基本上需要512个字节.同样,SURF最少也需要256个字节(用于64像素) ...
- 自动驾驶研究回顾:CVPR 2019摘要
我们相信开发自动驾驶技术是我们这个时代最大的工程挑战之一,行业和研究团体之间的合作将扮演重要角色.由于这个原因,我们一直在通过参加学术会议,以及最近推出的自动驾驶数据集和基于语义地图的3D对象检测的K ...
- NLPer入门指南 | 完美第一步
介绍 你对互联网上的大量文本数据着迷吗?你是否正在寻找处理这些文本数据的方法,但不确定从哪里开始?毕竟,机器识别的是数字,而不是我们语言中的字母.在机器学习中,这可能是一个棘手的问题. 那么,我们如何 ...
- Fiddler抓取数据包分析案例
案例:利用Fiddler抓取苏宁易购网站数据包分析 抓包软件:Fiddler4 请求名字:www.suning.com 详细内容: 一.了解数据包区域的字段含义 图1数据包区域 #:顺序号,按照抓包的 ...
- 电脑网络诊断显示Win10无法与设备或资源(DNS)通信解决办法
最近是做多错多还是人有点儿衰神附体,软件,电脑系统,各种问题层出不穷,今天早上打开电脑发现不少软件都无法联网,神马百度商桥,腾讯浏览器,百度云...昨天百度商桥打不开还以为是软件出了问题,因为火狐浏览 ...
- Linux和Windows环境下安装Nginx
Nginx的安装 windows环境下安装Nginx 安装 Nginx 的下载地址如下: http://nginx.org/en/download.html 选择时尽量选择 Stable 稳定版本,点 ...
- [noip模拟赛]某种数列问题<dp>
某种数列问题 (jx.cpp/c/pas) 1000MS 256MB 众所周知,chenzeyu97有无数的妹子(阿掉!>_<),而且他还有很多恶趣味的问题,继上次纠结于一排妹子的排法以 ...
- Activiti网关--包含网关
1.什么是包含网关 包含网关可以看做是排他网关和并行网关的结合体:和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们:但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样,包 ...
- C - 啥~ 渣渣也想找玩数字 HDU - 2141(有序序列枚举 + 二分优化查找)
题目描述 可爱的演演又来了,这次他想问渣渣一题... 如果给你三个数列 A[],B[],C[],请问对于给定的数字 X,能否从这三个数列中各选一个,使得A[i]+B[j]+C[k]=X? 输入 多组数 ...
- 分派pie(二分法)
2.问题描述 我的生日要到了!根据习俗,我需要将一些派分给大家.我有N个不同口味.不同大小的派.有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成:可以是一整个派 ...