目录
- 💨更多相关知识👇
-
- 一、什么是迭代器?
- 二、迭代器的方法
-
- 🌟代码演示
- 三、使用迭代器常见的异常
-
- ⚡NoSuchElementException异常1
- ⚡NoSuchElementException异常2
- ⚡NoSuchElementException异常3
- ⚡无限循环
- 四、并发修改异常
-
- 🍂产生原因
-
- 🌟代码演示
- 🍂解决办法
-
- 🌟代码演示
- 五、什么是增强for循环?
- 六、增强for循环的语法格式
-
- 🌟代码演示
- 七、增强for循环的注意事项
- 作者:KJ.JK
💨更多相关知识👇
💖JavaEE中的面向对象特征之封装
💖ArrayList集合中的常用成员方法
💖Java中String的split切割字符串方法详解
💖String中的replace的四个方法
💖JavaEE中的Stream流的常用方法
💖JavaEE中的Stream流知识点使用,精华总结,一文直接上手
💖JavaWeb中的过滤器(Filter)和监听器(Listener)区别
💖JavaEE中史上最全String类入门介绍文章,学习StringAPI这一篇即可
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: KJ.JK
欢迎大家点赞👍收藏💖评论💬关注🔒
💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者
一、什么是迭代器?
* JDK中提供了一个"Iterator接口",称为迭代器,可以"实现单列集合元素的遍历"
* Collection接口中提供了iterator()方法,可以获取迭代器对象
//只能是单列集合使用,Map里面的双列集合是不可以的
二、迭代器的方法
* public boolean hasNext() : 判断是否存在下一个元素
* public E next() : 获取下一个元素 (next()方法"获取元素",并且"指针移动"到下一个位置)
* public void remove() : 删除元素
------------------------------------------------------------------------------------------------------------
// 迭代器使用步骤 : (所有的单列集合都可以使用,因为迭代器是在Collection基础下的)
1. 获取迭代器的对象 集合.iterator();
2. 循环中,判断是否有元素可以获取 hasNext();
3. 进入循环,调用next去获取元素 next();
🌟代码演示
HashSet<String> set=new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
set.add("张三");
//获取迭代器的对象
Iterator<String> itr = set.iterator();
//hasNext():判断集合是否存在下一个元素,有返回true
while (itr.hasNext()){
String name = itr.next(); //获取集合的对象
System.out.println(name);
}
三、使用迭代器常见的异常
⚡NoSuchElementException异常1
HashSet<String> set=new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
set.add("张三");
//获取迭代器的对象
Iterator<String> itr = set.iterator();
//获取集合的对象
System.out.println(itr.next());
System.out.println(itr.next());
System.out.println(itr.next());
System.out.println(itr.next());
//NoSuchElementException ,如果超过集合的长度取的话就会报没有这个数据的异常
//解决办法: 使用hasNext()判断取元素
⚡NoSuchElementException异常2
HashSet<String> set = new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
set.add("张三");
//获取迭代器的对象
Iterator<String> itr = set.iterator();
//hasNext():判断集合是否存在下一个元素,有返回true
while (itr.hasNext()) {
//不要在一次循环中,多次调用next方法
//这里代表的是一次循环获取两个数据,如果是偶数的话就没有问题,如果是奇数的话就会报异常,获取不到,不建议
System.out.println(itr.next());
System.out.println(itr.next());
}
⚡NoSuchElementException异常3
HashSet<String> set = new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
set.add("张三");
//获取迭代器的对象
Iterator<String> itr = set.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
// 使用迭代器时候,数据不能重复使用
System.out.println(itr.next());
//NoSuchElementException ,因为这个迭代器里面的数据已经用完了,
//不能再使用这个迭代器获取数据,想使用的话要用新的迭代器
-----------------------------------------------------------------------------------------------------------
//解决办法 : 再次获取一个新的迭代器
Iterator<String> itr2 = set.iterator();
while (itr2.hasNext()){
String next = itr2.next();
System.out.println(next);
}
⚡无限循环
Iterator<String> itr2 = set.iterator();
while (itr2.hasNext()){
String next = itr2.next();
System.out.println(next);
}
//一直问有没有数据,不做操作会进入死循环
while(itr2.hasNext()){
}
🔥系列热门专栏🔥:
⚡《JavaEE进阶序列 | 从小白到工程师》系列文章⚡
⚡《JavaEE项目实战》系列文章⚡
⚡《JavaSwing项目合集》系列文章⚡
⚡《数据分析中的pandas》系列文章⚡
四、并发修改异常
🍂产生原因
当使用迭代器或者增强for循环遍历集合时,
在迭代过程中调用集合类自身的remove或者add等方法改变集合的元素个数时,
就会产生"ConcurrentModificationException",即"并发修改异常"
"(两个对象同时在执行操作,造成冲突)"
🌟代码演示
ArrayList<Integer> list=new ArrayList<>();
list.add(11);
list.add(22);
list.add(33);
list.add(44);
list.add(55);
Iterator<Integer> it1 = list.iterator();
// 迭代器在遍历集合,集合对象在删除数据,造成对数据处理的冲突
while (it1.hasNext()){
Integer number = it1.next();
if(number%2==0){
list.remove(number);
}
}
System.out.println(list); //ConcurrentModificationException : 并发修改异常
// 两个对象同时在执行操作,造成冲突
🍂解决办法
1.使用普通for循环遍历元素,在循环中"使用集合自带的add或remove方法增删元素即可"
2.如果使用迭代器遍历集合,在迭代过程中如果需要删除元素,可以"使用迭代器自带的remove方法"
🌟代码演示
ArrayList<Integer> list=new ArrayList<>();
list.add(11);
list.add(22);
list.add(33);
list.add(44);
list.add(55);
Iterator<Integer> it1 = list.iterator();
//解决办法:统一成一个对象就行
while (it1.hasNext()){
Integer number = it1.next();
if(number%2==0){
it1.remove();
}
}
//也可以集合自己遍历删
for (int i = 0; i < list.size(); i++) {
Integer number = list.get(i);
if(number%2==0){
list.remove(number);
i--;
}
}
}
}
五、什么是增强for循环?
* 它是JDK5之后出现的,其内部原理是一个"Iterator迭代器"
* "数组"和"Collection集合"都可以使用增强for循环
//作用: 简化迭代器遍历的语法
六、增强for循环的语法格式
格式:
for(元素数据类型 变量名 : "数组" 或者 "Collection集合") {
//在此处使用变量即可,该变量就是代表每一个元素
}
范例1: HashSet<String> set=new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
set.add("赵六");
//使用增强for循环变量(简化迭代器)
/*
for (元素类型 变量名 : 集合或数组){
}
*/
for(String s : set){
//s 就代表set集合中的每一个元素
System.out.println(s);
}
------------------------------------------------------------------------------------------------------------
范例2: int [] arr= {11,22,33};
for (int i : arr) {
System.out.println(i);
}
// 增强for快捷键,集合或数组.for
🌟代码演示
七、增强for循环的注意事项
* 增强for循环底层是"迭代器",所以"不要在遍历过程中增删元素", 否则会有并发修改异常
* 增强for循环操作的是"数组"或"集合"
* 需要遍历的集合或数组"不能为null"
作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习
版权声明:程序员胖胖胖虎阿 发表于 2022年11月9日 上午9:00。
转载请注明:【JavaEE进阶系列 | 从小白到工程师】JavaEE中的迭代器,并发修改异常与增强for循环,一文上手使用 | 胖虎的工具箱-编程导航
转载请注明:【JavaEE进阶系列 | 从小白到工程师】JavaEE中的迭代器,并发修改异常与增强for循环,一文上手使用 | 胖虎的工具箱-编程导航
相关文章
暂无评论...