Collections.shuffle 是 Java 中基于 Fisher-Yates 算法实现的 List 随机打乱方法,保证等概率排列,仅适用于可修改的 List(如 ArrayList),不支持 Set 或数组;可传入 Random 实例确保结果可重现,对不可变集合会抛异常,安全做法是先复制为新 ArrayList 再调用。

Collections.shuffle 是 Java 提供的便捷方法,用于随机打乱 List 中元素的顺序。它基于 Fisher-Yates 洗牌算法实现,保证各排列等概率出现,且只作用于 List 接口(如 ArrayList、LinkedList),不能直接用于 Set 或数组。
基本用法:直接调用 shuffle(List)
最常用的方式是传入一个可变的 List,方法会原地修改其顺序:
- 确保集合是非空且可修改的(如
new ArrayList(),不能是Arrays.asList()返回的固定大小列表,否则运行时抛UnsupportedOperationException) - 无需返回值,操作后原列表已重排
示例:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d")); Collections.shuffle(list); // 打乱后 list 可能变成 ["c", "a", "d", "b"]指定随机源:保证可重现性
如果需要结果可复现(比如测试或调试),可以传入自定义的 Random 实例:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用带参重载方法
Collections.shuffle(list, random) - 传入相同种子的
Random对象,每次 shuffle 结果一致
示例:
Random fixedRandom = new Random(42L); Collections.shuffle(list, fixedRandom); // 每次执行都得到相同打乱顺序注意不可变或只读集合
以下情况会出错或无效:
-
Collections.unmodifiableList()包装的列表 → 抛UnsupportedOperationException -
Arrays.asList()返回的列表 → 底层数组固定长度,add/remove 不支持,shuffle 可能成功但存在风险(JDK 版本行为略有差异) - 非
List类型(如HashSet)→ 编译不通过
安全做法:先复制为 new ArrayList(original) 再 shuffle。
替代方案:打乱数组或 Stream
如果手头是数组或想函数式处理:
- 数组:用
Random+ 循环手动 Fisher-Yates,或转成List后 shuffle 再转回 - Stream(Java 8+):没有内置 shuffle,但可通过
sorted(Comparator.comparingDouble(x -> Math.random()))近似实现(不推荐用于大数据,稳定性与效率不如 shuffle)
真正需要打乱时,优先用 Collections.shuffle —— 简洁、高效、语义明确。

















