为什么我用不同的方法调用迭代器时会得到不同的结果?


Set<Integer> set = new HashSet<>();
for (int i = 0; i < 10; i++) {
set.add(i);
}
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("================================");
while (set.iterator().hasNext()){
System.out.println(set.iterator().next());
}

你应该在这里输入图像描述

我想遍历set集合,所以我使用Iterator创建一个迭代器对象,并使用该集合直接调用Iterator,但前者给出了正确的结果,而后者是一个无限循环。我不明白,你能告诉我这两者的区别吗?谢谢你!

迭代器是有状态的并且维护它们自己的状态。简化:它们记住它们在集合中的当前位置。

在一个集合(实际上是一个java.lang.Iterable<T>)上调用.iterator(),每次都会得到一个NEW迭代器实例。所以while (set.iterator.hasNext())总是会创建一个新的迭代器从开始的地方开始。退出循环的唯一方法是设置一个空集合(在这种情况下,将永远不会进入循环)。

通过只调用一次.iterator()并将实例存储在变量中,您可以推进该迭代器(并更新其内部状态/位置)。

相关内容

最新更新