You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用Iterator的两种方式结果不同?HashSet遍历遇无限循环

HashSet两种迭代方式的差异解析

先看你贴的代码,两种遍历方式的核心区别在于是否复用同一个迭代器实例:

第一种方式:复用单个迭代器

Iterator iterator = set.iterator();
while (iterator.hasNext()){
    System.out.println(iterator.next());
}

这里只调用了一次set.iterator(),得到一个绑定当前HashSet的迭代器对象。迭代器内部维护了一个遍历指针,每次调用next()都会把指针往后移动一位,hasNext()会根据指针位置判断是否还有未遍历的元素。当指针走到集合末尾时,hasNext()返回false,循环正常结束,所以能依次输出0到9所有元素。

第二种方式:每次循环生成新迭代器

while (set.iterator().hasNext()){
    System.out.println(set.iterator().next());
}

这种写法的问题在于:

  • 每次执行while的条件判断时,都会调用set.iterator()生成一个全新的迭代器,这个新迭代器的指针默认指向集合的起始位置,所以hasNext()永远返回true(只要集合不为空)。
  • 进入循环体后,又再次调用set.iterator()生成另一个新迭代器,调用它的next()只会返回集合的第一个元素(也就是0)。
  • 循环往复,每次都是新迭代器判断有元素、输出第一个元素,永远到不了集合末尾,自然就陷入了无限循环。

简单总结:迭代器是独立维护遍历状态的工具,复用同一个迭代器才能完成完整遍历;每次生成新迭代器相当于每次都从头开始遍历,永远走不完集合。

内容的提问来源于stack exchange,提问作者Mazai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:45:33