赋值给集合_JavaIterator(迭代器)遍历Collection集合元素
Iterator(迭代器)是⼀个接⼝,它的作⽤就是遍历容器的所有元素,也是 Java 集合框架的成员,但它与 Collection 和 Map 系列的集合不
refer to⼀样,Collection 和 Map 系列集合主要⽤于盛装其他对象,⽽ Iterator 则主要⽤于遍历(即迭代访问)Collection 集合中的元素。Iterator
接⼝隐藏了各种 Collection 实现类的底层细节,向应⽤程序提供了遍历 Collection 集合元素的统⼀编程接⼝。Iterator 接⼝⾥定义了如下
4 个⽅法。
boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回 true。
Object next():返回集合⾥的下⼀个元素。
void remove():删除集合⾥上⼀次 next ⽅法返回的元素。
void forEachRemaining(Consumer action):这是 Java 8 为 Iterator 新增的默认⽅法,该⽅法可使⽤ Lambda 表达式来遍历集合元素。
下⾯程序⽰范了通过 Iterator 接⼝来遍历集合元素。
import java.util.Collection;import java.util.HashSet;import java.util.Iterator;public class IteratorTest { public static void main(String[] args) { // 创建⼀个集合
从上⾯代码中可以看出,Iterator 仅⽤于遍历集合,如果需要创建 Iterator 对象,则必须有⼀个被迭代的集合。没有集合的 Iterator 没有
存在的价值。
注意:Iterator 必须依附于 Collection 对象,若有⼀个 Iterator 对象,则必然有⼀个与之关联的 Collection 对象。Iterator 提供了两个⽅
法来迭代访问 Collection 集合⾥的元素,并可通过 remove() ⽅法来删除集合中上⼀次 next() ⽅法返回的集合元素。上⾯程序中第 24 ⾏
代码对迭代变量 obj 进⾏赋值,但当再次输岀 objs 集合时,会看到集合⾥的元素没有任何改变。所以当使⽤ Iterator 对集合元素进⾏迭代
时,Iterator 并不是把集合元素本⾝传给了迭代变量,⽽是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本⾝没有任
何影响。当使⽤ Iterator 迭代访问 Collection 集合元素时,Collection 集合⾥的元素不能被改变,只有通过 Iterator 的 remove() ⽅法删sm是啥>六级准考证打印入口
除上⼀次 next() ⽅法返回的集合元素才可以,否则将会引发“java.util.ConcurrentModificationException”异常。下⾯程序⽰范了这⼀
点。
public class IteratorErrorTest { public static void main(String[] args) { // 创建⼀个集合 Collection objs = new HashSet(); objs.add("C语⾔中⽂⽹Java教输出结果为:
mtoC语⾔中⽂⽹C++教程
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.Node(Unknown Source)
在哪里的英文
at java.util.(Unknown Source)
at IteratorErrorTest.main(IteratorErrorTest.java:15)
like i do
conversation上⾯程序中第 15 ⾏代码位于 Iterator 迭代块内,也就是在 Iterator 迭代 Collection 集合过程中修改了 Collection 集合,所以程序将在moebius
运⾏时引发异常。Iterator 迭代器采⽤的是快速失败(fail-fast)机制,⼀旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程
修改),程序⽴即引发 ConcurrentModificationException 异常,⽽不是显⽰修改后的结果,这样可以避免共享资源⽽引发的潜在问题。
调控情绪快速失败(fail-fast)机制,是 Java Collection 集合中的⼀种错误检测机制。
注意:上⾯程序如果改为删除“C语⾔中⽂⽹C语⾔教程”字符串,则不会引发异常。这样可能有些读者会“⼼存侥幸”地想,在迭代时好
像也可以删除集合元素啊。实际上这是⼀种危险的⾏为。对于 HashSet 以及后⾯的 ArrayList 等,迭代时删除元素都会导致异常。只有在
hit point删除集合中的某个特定元素时才不会抛出异常,这是由集合类的实现代码决定的,程序员不应该这么做。