为何调用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
相关产品推荐
相关产品推荐

