Java Iterator(迭代器)遍历Collection元素
Iterator 接口隐藏了各种 Collection 实现类的底层细节,向应用程序提供了遍历 Collection 元素的统一编程接口。Iterator 接口里定义了如下 4 个方法。
boolean hasNext():如果被迭代的元素还没有被遍历完,则返回 true。
Object next():返回里的下一个元素。
void remove():删除里上一次 next 方法返回的元素。
void forEachRemaining(Consumer action):这是 Java 8 为 Iterator 新增的默认方法,该方法可使用 Lambda 表达式来遍历元素。
下面程序示范了通过 Iterator 接口来遍历元素。
从上面代码中可以看出,Iterator 仅用于遍历,如果需要创建 Iterator 对象,则必须有一个被迭代的。没有的 Iterator 没有存在的价值。import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class IteratorTest {
public static void main(String[] args) {
// 创建一个
Collection objs = new HashSet();
objs.add("C语言中文网Java教程");
objs.add("C语言中文网C语言教程");
objs.add("C语言中文网C++教程");
// 调用forEach()方法遍历
// 获取books对应的迭代器
Iterator it = objs.iterator();
while (it.hasNext()) {
// it.next()方法返回的数据类型是Object类型,因此需要强制类型转换
String obj = (String) it.next();
System.out.println(obj);
if (obj.equals("C语言中文网C语言教程")) {
// 从中删除上一次next()方法返回的元素
it.remove();
}
// 对book变量赋值,不会改变元素本身
obj = "C语言中文网Python语言教程";
}
System.out.println(objs);
}
}
注意:Iterator 必须依附于 Collection 对象,若有一个 Iterator 对象,则必然有一个与之关联的 Collection 对象。Iterator 提供了两个方法来迭代访问 Collection 里的元素,并可通过 remove() 方法来删除中上一次 next() 方法返回的元素。
上面程序中第 24 行代码对迭代变量 obj 进行赋值,但当再次输岀 objs 时,会看到里的元素没有任何改变。所以当使用 Iterator 对元素进行迭代时,Iterator 并不是把元素本身传给了迭代变量,而是把元素的值传给了迭代变量,所以修改迭代变量的值对元素本身没有任何影响。
当使用 Iterator 迭代访问 Collection 元素时,Collection 里的元素不能被改变,只有通过 Iterator 的 remove() 方法删除上一次 next() 方法返回的元素才可以,否则将会引发“java.util.ConcurrentModificationException”异常。下面程序示范了这一点。
public class IteratorErrorTest {
public static void main(String[] args) {
// 创建一个
Collection objs = new HashSet();
objs.add("C语言中文网Java教程");
objs.add("C语言中文网C语言教程");
objs.add("C语言中文网C++教程");
// 获取books对应的迭代器
Iterator it = objs.iterator();
while (it.hasNext()) {
String obj = (String) it.next();
System.out.println(obj);
if (obj.equals("C语言中文网C++教程")) {
// 使用Iterator迭代过程中,不可修改元素,下面代码引发异常
objs.remove(obj);
}
}
}
}
输出结果为:
C语言中文网C++教程
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at IteratorErrorTest.main(IteratorErrorTest.java:15)
上面程序中第 15 行代码位于 Iterator 迭代块内,也就是在 Iterator 迭代 Collection 过程中修改了 Collection ,所以程序将在运行时引发异常。Iterator 迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该已经被修改(通常是程序中的其他线程修改),程序立即引发 ConcurrentModificationException 异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题。
快速失败(fail-fast)机制,是 Java Collection 中的一种错误检测机制。
注意:上面程序如果改为删除“C语言中文网C语言教程”字符串,则不会引发异常。这样可能有些读者会“心存侥幸”地想,在迭代时好像也可以删除元素啊。实际上这是一种危险的行为。对于 HashSet 以及后面的 ArrayList 等,迭代时删除元素都会导致异常。只有在删除中的某个特定元素时才不会抛出异常,这是由类的实现代码决定的,程序员不应该这么做。
- 随机文章
- 核心危机(核心危机魔石合成攻略)
- 风儿(风儿轻轻的吹)
- 饿了么红包怎么用(饿了么红包怎么用微信支付)
- 儿童教育文章(儿童教育)
- 光遇花手先祖位置(安卓光遇手花先祖)
- 抖音卡(抖音卡顿怎么解决)
- xboxones(xboxone手柄怎么配对主机)
- 兵马俑(兵马俑介绍和历史背景)
- 陈武简历
- 帆船比赛(帆船比赛视频)
- 海猫鸣泣之时游戏(海猫鸣泣之时游戏在哪玩)
- 韩国媳妇和小雪(韩国媳妇和小雪的父亲工资是多少)
- 儋州市第二中学(儋州市第二中学录取分数线)
- 鬼泣5攻略(鬼泣5攻略第三关怎么跳)
- 地球日主题(2020年世界地球日主题)
- 和柳亚子(和柳亚子先生于田)
- 冰客(冰客果汁)
- yy魔兽(yy魔兽世界)
- 国外成人游戏(国外成人游戏注册需要visa信用卡)
- 郭妮小说(恶魔的法则郭妮小说)
- 杭同(杭同培训中心怎么样)
- 蝙蝠给人类的一封信(蝙蝠给人类的一封信)
- 服饰加盟(服饰加盟店招商)
- 疯狂填字(疯狂填字5)
- 点对点短信息(点对点短信息费是什么意思)
- 观音普门品(观音普门品念诵全文)
- 河北省大运会(河北省大运会时间)
- 哈利波特官网(哈利波特官网在哪里)
- 骇客神条(骇客神条怎么辨别真假)
- 杜星霖(杜星霖图片)
