Java中LinkedList的ListIterator调用next()为何每次都返回相同元素
问题根因
- 你每次调用
skip方法时,都会在方法内部通过stringList.listIterator()创建一个全新的迭代器实例,listIterator()无参调用默认返回的是从列表首元素位置开始的迭代器,所以每次调用skip都是从第一个元素开始取,自然每次输出都是First Element。 - 你在
main方法中创建的迭代器和skip方法内部的迭代器是完全独立的对象,迭代器的游标状态不会互相共享。
修复方案
方案1:直接共享迭代器实例
把迭代器作为参数传入skip方法,所有切歌操作共用同一个迭代器,就能延续游标状态,修改后的代码如下:
import java.util.LinkedList; import java.util.ListIterator; public class testClass { public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.add("First Element"); list.add("Second Element"); list.add("Third Element"); ListIterator<String> iter = list.listIterator(); System.out.println(iter.next()); System.out.println(iter.next()); System.out.println("======================"); // 把迭代器作为参数传入skip方法 skip(iter); skip(iter); } // 方法参数改为接收迭代器而非列表 public static void skip(ListIterator<String> iter) { if(iter.hasNext()) System.out.println(iter.next()); } }
修改后输出如下:
First Element Second Element ====================== Third Element
方案2:封装播放列表类(更适配歌曲播放场景)
针对你要实现的播放列表功能,更合理的实现是把歌曲列表、当前播放位置、迭代器都封装成独立的类,内部维护状态,对外暴露切歌、加歌、循环控制等方法,避免状态散乱,示例实现如下:
import java.util.LinkedList; import java.util.ListIterator; class Playlist { private final LinkedList<String> songs = new LinkedList<>(); private ListIterator<String> currentIter; // 循环播放开关 private boolean loopEnabled = false; public void addSong(String song) { songs.add(song); // 首次加歌时初始化迭代器 if (currentIter == null) { currentIter = songs.listIterator(); } } public void setLoopEnabled(boolean loopEnabled) { this.loopEnabled = loopEnabled; } // 前进切歌 public String nextSong() { if (songs.isEmpty()) return null; if (!currentIter.hasNext()) { if (loopEnabled) { // 开启循环则回到列表开头 currentIter = songs.listIterator(); } else { return null; } } return currentIter.next(); } // 后退切歌 public String prevSong() { if (songs.isEmpty()) return null; if (!currentIter.hasPrevious()) { if (loopEnabled) { // 开启循环则回到列表末尾 currentIter = songs.listIterator(songs.size()); } else { return null; } } return currentIter.previous(); } } public class testClass { public static void main(String[] args) { Playlist playlist = new Playlist(); playlist.addSong("First Element"); playlist.addSong("Second Element"); playlist.addSong("Third Element"); // 开启循环播放 playlist.setLoopEnabled(true); System.out.println(playlist.nextSong()); System.out.println(playlist.nextSong()); System.out.println("======================"); System.out.println(playlist.nextSong()); System.out.println(playlist.nextSong()); // 循环后回到第一个元素 } }
内容的提问来源于stack exchange,提问作者Infernalissss
相关产品推荐
相关产品推荐

