ArrayList存歌名需空值检查防NPE;Arrays.asList返回不可变列表;重复歌名用ArrayList或LinkedList,去重用LinkedHashSet;播放列表推荐LinkedList配currentIndex;操作前必检索引越界与空指针。

用 ArrayList 存歌名最直接,但别忘了加空值检查
初学者最容易犯的错是往列表里塞 null 歌名,结果调用 toString() 或遍历时抛 NullPointerException。Java 的 ArrayList<string></string> 本身允许存 null,但播放逻辑通常不处理它。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 添加歌曲前先判断:
if (songName != null && !songName.trim().isEmpty()) - 用
Arrays.asList("Beat It", "Billie Jean")快速初始化测试数据,但注意返回的是不可变列表,后续add()会抛UnsupportedOperationException - 如果要支持重复歌名(比如同一首歌不同版本),就别用
Set;若需去重,改用LinkedHashSet保持插入顺序
用 LinkedList 实现“下一首”“上一首”更自然
ArrayList 随机访问快,但频繁在中间增删(比如删除当前播放曲、插到播放位置前)时性能差;而播放列表的典型操作是头尾进出、前后切换,LinkedList 的双向链表结构更贴合。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 用
LinkedList<string></string>存歌单,配合一个int currentIndex记录当前播放索引 - 调用
list.get(index)前务必检查index >= 0 && index ,否则抛 <code>IndexOutOfBoundsException - 避免用
list.removeFirst()模拟“跳过”,它删的是第一首,不是当前首——得用list.remove(currentIndex),然后根据删的是前面还是后面调整currentIndex
封装成类比写一堆 main 方法靠谱得多
把歌单逻辑散在 main 里,加个“循环播放”功能就得改七八处,还容易漏掉边界(比如最后一首按“下一首”该跳回第一首)。封装后,状态和行为绑定,调试也集中。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 定义
MusicPlaylist类,字段至少包含:private LinkedList<string> songs</string>、private int currentIndex、private boolean isLooping - 提供
playNext()和playPrevious()方法,内部统一处理越界:循环播放时用取模(currentIndex + 1) % songs.size(),非循环时限制在[0, size-1] - 别在构造函数里自动播放——初学者常在这里卡住,因为还没加歌就调
play(),应显式调用addSong()后再play()
打印歌单时别直接 System.out.println(list)
默认输出类似 [Beat It, Billie Jean, Thriller],看着还行,但一旦元素是自定义对象(比如未来升级成 Song 类),就会打一串 Song@1f32e575,啥也看不出。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 哪怕现在只存
String,也养成重写toString()的习惯:@Override public String toString() { return "Playlist{" + "songs=" + songs + ", current=" + getCurrentSong() + '}'; } - 遍历打印时用增强 for 循环比传统 for 更安全,少写错索引:
for (String song : songs) { System.out.println((songs.indexOf(song) == currentIndex ? "> " : " ") + song); } - 如果用 IDE 调试,记得点开
songs字段看实际内容——很多“没加进去”的问题,其实是忘了调addSong(),或者加到了另一个列表实例里
真正卡住人的地方,往往不是“怎么实现循环播放”,而是“为什么 currentIndex 总是 -1”或者“为什么删了歌,size() 没变”——状态没同步、对象引用搞混、空指针没拦截,这些细节比算法本身花时间

















