一、什么是迭代器?
* JDK中提供了一个"Iterator接口",称为迭代器,可以"实现单列集合元素的遍历"
* Collection接口中提供了iterator()方法,可以获取迭代器对象
二、迭代器的方法
* public boolean hasNext() : 判断是否存在下一个元素
* public E next() : 获取下一个元素 (next()方法"获取元素",并且"指针移动"到下一个位置)
* public void remove() : 删除元素
------------------------------------------------------------------------------------------------------------
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();
while (itr.hasNext()){
String name = itr.next();
System.out.println(name);
}
三、使用迭代器常见的异常
1、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());
2、NoSuchElementException异常2
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());
}
3、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());
-----------------------------------------------------------------------------------------------------------
Iterator<String> itr2 = set.iterator();
while (itr2.hasNext()){
String next = itr2.next();
System.out.println(next);
}
4、无限循环
Iterator<String> itr2 = set.iterator();
while (itr2.hasNext()){
String next = itr2.next();
System.out.println(next);
}
while(itr2.hasNext()){
}
四、并发修改异常
1、产生原因
当使用迭代器或者增强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);
2、解决办法
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--;
}
}
}
}
作者:KJ.JK
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习
|