Collections.shuffle 是 Java 中专为 List 设计的原地随机化工具,基于 Fisher-Yates 算法确保均匀分布,支持泛型和固定种子复现,但仅适用于可修改 List。

Collections.shuffle 是 Java 中最直接、最可靠的集合随机化工具,专为 List 设计,原地打乱顺序,无需额外依赖或手写算法。
基础用法:一行代码完成打乱
只要传入一个可修改的 List(如 ArrayList、LinkedList),调用 Collections.shuffle(list) 即可。方法不返回新列表,而是直接修改原列表。
- 支持泛型,任意元素类型都适用(String、Integer、自定义对象等)
- 底层采用 Fisher-Yates 算法,确保每个排列概率均等,无偏倚
- 空列表或单元素列表调用后无变化,安全无副作用
可控随机:用固定种子实现可重现打乱
测试或调试时,需要每次运行结果一致?传入带种子的 Random 实例即可:
- Random random = new Random(42);
- Collections.shuffle(list, random);
- 相同种子 → 相同随机序列 → 打乱结果完全可复现
生产环境建议省略种子,使用默认随机源以保证真正随机性。
立即学习“Java免费学习笔记(深入)”;
常见陷阱与绕过方案
shuffle 只接受 List,对 Set、Map 或不可变列表会抛 UnsupportedOperationException。
- 对 Set 打乱:先转成 ArrayList,再 shuffle,例如 new ArrayList(mySet)
- 避免 Arrays.asList() 返回的“假可变”列表:它不支持 set 操作,需包装为 new ArrayList(Arrays.asList(...))
- 若需保留原始顺序,打乱前手动复制:new ArrayList(originalList)
典型应用场景
这个方法轻量却实用,几个高频用例值得记住:
- 卡牌游戏洗牌:初始化一副牌 List
,调用 shuffle 即可模拟真实洗牌 - 问卷选项随机化:将题目选项放入 List,shuffle 后逐条展示,防顺序偏差
- 推荐候选集扰动:对 top-N 推荐结果做一次 shuffle,提升多样性体验
- 单元测试构造随机输入:配合固定种子,让测试数据既随机又稳定


















