java iterator循环遍历集合(比如HashSet)的原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java iterator循环遍历集合(比如HashSet)的原理相关的知识,希望对你有一定的参考价值。

Set<String> set=new HashSet<String>();
set.add("fcc");
set.add("yhl");
set.add("ws");
set.add("fdd");
for(Iterator<String> it=set.iterator();it.hasNext();)

String str=it.next();
System.out.println(str);

我不是很清楚:Iterator<String> it=set.iterator();因为学过C++,C++里面的迭代器初始化一般都是指向容器的开始或者具体哪个迭代器,这里的初始化是什么意思?它也是指向集合的开始一个元素?看了API说是:返回一个在一组 T 类型的元素上进行迭代的迭代器。还是不懂
还有,一般循环不是要有个递增或递减的条件吗?这里怎么没有?这里的迭代器到底是怎么实现的?它不是指向某一个元素然后依次指下去吗?可是it没有变化啊?按我的逻辑推理应该是一直输出第一个元素= =
哪位大神能够指导一下小白啊
for(Iterator<String> it=set.iterator();it.hasNext();)

System.out.println(it.next());
String str=it.next();
System.out.println("sss"+str);

输出:
fcc
sssfdd
yhl
sssws

Iterator<String> it = set.iterator() 这时得到一个迭代器,它的指针位于第一个元素之前。
然后我们不停地 hasNext() 再 next 得到值,当hasNext 为 false 时当然就不能去 next 了。

这背后的位置索引是在迭代器内部记录着的,我们不能直接改它的值,只能 next 去下一个。
不过像 ListIterator 则是双向的,可以 previous。递增递减都是由 next / previous 方法来操作的。追问

我就是不知道这个迭代器(it)是怎么移动的在这个循环遍历中,我打印它,它一直是一样的,然后我以为只要成功调用了next()这个函数,它内部就会自动向下指,可是并没有,你看我的问题补充,然后我就想,难道是配合hasNext(),再用next(),内部才会这样实现?我知道了,应该就是调用一次next(),它内部就会指向下一个,就好像编译器自己产生了一个内部游标(并非it,)在执行指向功能

追答

正确,这点就是跟C++不同的地方,it 本身并没有变,而 it 内部的一个 index 变化了。

参考技术A 如果你用的是eclipse,按住ctrl键,鼠标左键点next()方法就能看到了,然后关联JDK源码就可以了追问

我看了帮助文档,完全没用

追答

next()方法是返回下一个元素。
hasNext();判断后面还有没有元素。
改成这样就好了
String str=it.next();
System.out.println(str);
System.out.println("sss"+str);

比如1,2,3,4,5五个元素
当前元素为2,通过next()方法返回3之后,当前元素就是3了;在调用一次next()返回的就是4了。

参考技术B it相当于是个指针,每次.next()都向下拨打。所以依次输出追问

每一次只要有it.next()出现,实际上就等于让it指向下一个了?可是我看next()的说明,只是说返回了下一个元素啊,并没有说同时让it指向了下一个元素(类似于it=it.nextIterator())?哪里能够看到next()具体实现的代码?

追答

只看结果不看说明。

以上是关于java iterator循环遍历集合(比如HashSet)的原理的主要内容,如果未能解决你的问题,请参考以下文章

Java中Set集合怎样用for遍历?

Java学习笔记5.2.3 List接口 - 遍历集合

Java 集合框架迭代器(Iterator)

java中Collection集合Iterator迭代器接口for each循环遍历集合或对象

Java中定义一个迭代器(Iterator)遍历完一个集合后,如果还要再遍历一次这个集合?

Java中Set集合怎样用for遍历?