直接调用Collections.shuffle()可原地打乱List顺序,基于Fisher-Yates算法保证等概率;需传入可修改的随机访问列表,支持自定义Random以提升可重复性;不可变集合须先转为ArrayList。

直接调用 Collections.shuffle() 即可打乱 List 中元素的顺序,它使用默认的随机源(基于当前时间的 Random 实例),内部采用 Fisher-Yates 洗牌算法,保证每个排列等概率出现。
基本用法:传入一个可变列表
该方法会**原地修改**列表,不返回新列表。注意只能用于支持随机访问的列表(如 ArrayList、LinkedList 也支持,但效率略低)。
- 确保列表是非 null 且可修改的(不能是
Collections.unmodifiableList()或Arrays.asList()返回的固定大小列表,除非它本身可修改) - 示例:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d"));
Collections.shuffle(list);
// list 现在可能是 ["c", "a", "d", "b"] 等任意排列
指定随机源:提升可重复性与测试友好性
传入自定义的 Random 对象,可用于单元测试中复现相同打乱结果,或使用更安全的随机源(如 SecureRandom)。
- 使用固定种子的
Random可让每次运行结果一致 - 示例:
Random rnd = new Random(42L); // 固定种子 Collections.shuffle(list, rnd); // 每次执行都得到相同顺序
注意事项:不可变列表和数组要先转成可变 List
Collections.shuffle() 不接受数组,也不支持只读视图。若原始数据是数组或不可变集合,需先复制为可修改的 ArrayList。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 对数组:用
Arrays.asList()包装后传入(仅当数组元素类型匹配时),或手动构造ArrayList - 对不可变列表:必须先创建新
ArrayList,否则抛UnsupportedOperationException - 错误示例:
List<Integer> fixed = List.of(1, 2, 3); // Java 9+ 不可变 Collections.shuffle(fixed); // 运行时报错!
正确做法:
List<Integer> mutable = new ArrayList<>(fixed); Collections.shuffle(mutable); // ✅
替代方案:Java 8+ 流式打乱(不推荐用于简单场景)
虽可用 Stream.generate() + Random::nextInt 手动实现,但无必要。若坚持函数式风格,可借助 ThreadLocalRandom 和索引重排,但代码更复杂、性能更低、可读性差。日常开发中,Collections.shuffle() 是最简洁可靠的选择。

















