Java 为什么我需要在ListIterator中调用两次previous(),以便进入';反向';迭代?

Java 为什么我需要在ListIterator中调用两次previous(),以便进入';反向';迭代?,java,iterator,next,Java,Iterator,Next,我们知道什么ListIterator有方法next()和previous(),可以在两个方向上遍历。所以我做了一个小程序来尝试 List<String> songs = new ArrayList<>(); songs.add("song1"); songs.add("song2"); songs.add("song3"); songs.add("song4");

我们知道什么
ListIterator
有方法
next()
previous()
,可以在两个方向上遍历。所以我做了一个小程序来尝试

List<String> songs = new ArrayList<>();
   songs.add("song1");
   songs.add("song2");
   songs.add("song3");
   songs.add("song4");

    ListIterator<String> iterator = songs.listIterator();

    System.out.println(iterator.next());
    System.out.println(iterator.next());
    System.out.println(iterator.next());

    System.out.println(iterator.previous());
    System.out.println(iterator.previous());
但是我错了。实际结果表明:

song1
song2
song3
song3
song2

有人能告诉我这是怎么发生的吗?当我“在”
song3
中时,光标不是在那里吗?所以当我在
previous()
中时,它会在那首歌之前给我一首?我怎样才能以简单的方式最终理解这个概念呢?

因为正如文档中所说的
next()
给出当前元素并将迭代器移动到下一个元素:

返回列表中的下一个元素并前进光标位置


当它打印
song3
时,光标会在
song3
之后移动,然后如果调用
previous()
,您将在光标之前获得元素,因此再次获得
song3

请查看
列表迭代器的

在迭代开始时,光标指向第一个元素之前

调用
next()
(1)检索光标位置后的第一个元素,(2)将光标向前移动到检索到的元素后的点

调用
previous()
(1)检索光标位置之前的第一个元素,并(2)将光标设置为指向检索到的元素之前


让我们检查第3行和第4行输出之间发生的问题

第二行输出后迭代器的状态:

                    "song1"   "song2"   "song3"   "song4"
cursor position:                      ^
现在再次调用
next()
,并输出
“song3”
。迭代器状态如下所示:

                    "song1"   "song2"   "song3"   "song4"
cursor position:                                ^
此时,调用
previous()
“song3”
将再次打印。操作后的迭代器状态如下:

                    "song1"   "song2"   "song3"   "song4"
cursor position:                      ^

状态:“(请注意,交替调用next和previous将重复返回相同的元素。)”这与迭代器在调用
next()
previous()
时如何移动当前位置有关。我明白了,但这没有意义。为什么有人想把它弄得如此混乱呢?
next
实现返回当前项,然后前进。意思是最后一次调用
next
后,指针指向
song4
previous
首先前进,然后返回值,这意味着指针返回到
song3
。如果光标保持在当前迭代器上,这不是更有意义吗?为什么要用这个例子来提升它并使其压倒一切?@Stefan并非JDK的所有方面都是完美设计的。这种实施已经存在了22年。他们不能改变语义,因为这会破坏人们的生活。实际上,我认为我从来没有使用过双向迭代器。@stefan这是因为每个人在迭代时都会这样做,即
t[I++]
,获取当前值并移动到下一个值。然后,
t[--i]
是相反的。
                    "song1"   "song2"   "song3"   "song4"
cursor position:                                ^
                    "song1"   "song2"   "song3"   "song4"
cursor position:                      ^