直接调用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"] 等任意排列</string>
指定随机源:提升可重复性与测试友好性
传入自定义的 Random 对象,可用于单元测试中复现相同打乱结果,或使用更安全的随机源(如 SecureRandom)。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 使用固定种子的
Random可让每次运行结果一致 - 示例:
Random rnd = new Random(42L); // 固定种子 Collections.shuffle(list, rnd); // 每次执行都得到相同顺序
注意事项:不可变列表和数组要先转成可变 List
Collections.shuffle() 不接受数组,也不支持只读视图。若原始数据是数组或不可变集合,需先复制为可修改的 ArrayList。
- 对数组:用
Arrays.asList()包装后传入(仅当数组元素类型匹配时),或手动构造ArrayList - 对不可变列表:必须先创建新
ArrayList,否则抛UnsupportedOperationException - 错误示例:
List<integer> fixed = List.of(1, 2, 3); // Java 9+ 不可变 Collections.shuffle(fixed); // 运行时报错!</integer>
正确做法:
List<integer> mutable = new ArrayList(fixed); Collections.shuffle(mutable); // ✅</integer>
替代方案:Java 8+ 流式打乱(不推荐用于简单场景)
虽可用 Stream.generate() + Random::nextInt 手动实现,但无必要。若坚持函数式风格,可借助 ThreadLocalRandom 和索引重排,但代码更复杂、性能更低、可读性差。日常开发中,Collections.shuffle() 是最简洁可靠的选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










