我对这个问题有疑问 next()
方法。如果我的代码中有这样一行 arrayOfStrings
尺寸=4):
Iterator<String> it = arrayOfStrings.iterator(); //arrayOfString is ArrayList<String>
while(it.hasNext()) {
String e = it.next();
System.out.println(e);
}
在第一次迭代时,迭代器开始指向索引为0的元素?或者像“索引-1”?
我问是因为据我所知 next()
方法返回集合中的下一个元素。
所以,如果在第一次迭代时,迭代器从索引0开始,当 next()
调用时,它返回索引1处的元素,我赢了´无法对索引0处的元素执行任何操作?
3条答案
按热度按时间flvtvl501#
想想
next
分两步进行。首先它在迭代器中获取下一项,然后它增加指针以指向下一项。因此,当您创建一个新的迭代器时,它将被初始化以返回列表中的第一项(索引0)。5cg8jx4n2#
我想象迭代器工作方式的方式是把它看作是放在索引之间的东西。所以当第一个
next()
您可以返回存储在[0]索引下的值,调用之后,迭代器在索引[0]和[1]之间等待下一次调用返回存储在索引[1]中的值。第二次之后next()
调用迭代器在[1]和[2]之间等待,依此类推。。。这只是我习惯迭代器的方法,但它可能会对您有所帮助。
yb3bgrhw3#
您显示的代码将正确打印
ArrayList
. 这个it.next()
call在第一次调用时也是第一个元素。这个元素通常用索引0表示。请注意,您可能需要重命名
arrayOfStrings
从技术上讲,它不是数组,它更像一个数组List
. 用户可能会认为它是一个数组。文件
在我看来,你是对的,该方法的文档可能有点混乱,因为它非常紧凑:
返回迭代中的下一个元素。
然而,描述可能需要如此详细,因为
Iterator
是一个非常常用的接口,不仅用于集合。我可以想象一个类,其中第一个迭代元素不应该是底层结构的第一个元素。例如,在给定点之前已经读取的某种流。所以基本上是由实现类来决定第一个元素是什么。但对于集合,它将真正成为第一个元素(索引0)。对于每个
还要注意,您展示的迭代相当于扩展for循环(for each)在java中的工作方式。所以像这样的语法
会被当作
事实上,这就是为什么您可以使用所有实现
Iterable
在扩展for循环中。知道这一点,如果
iter.next()
将跳过第一个元素。我的意思是每个元素的名字应该迭代所有元素。洞察
让我们仔细看看这个方法是如何实现的。所以我们先看看
ArrayList#iterator
做。看看它的源代码:这个
Itr
类是类的私有类ArrayList
(源代码)。这里是Itr#next
方法:所以它本质上返回的是索引处的元素
i
这就是游标在调用方法时所处的位置。在下一次调用方法时,它也已经将游标前进了一步。但是,游标隐式初始化为
0
原因:所以第一个电话
next
将返回索引处的元素0
这是第一个元素。