You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:18:00