2021-10-02 06:47:28
Java中的Collections.shuffle()方法通过Fisher-Yates算法随机打乱List集合元素的顺序,确保每个排列概率均等,支持自定义随机源,适用于ArrayList等可修改的List,不可直接用于Set或Map。
核心功能与用法基本用法
直接调用Collections.shuffle(List),使用默认随机源(new Random())打乱列表顺序。
示例:List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));Collections.shuffle(list);System.out.println(list); // 输出如 [C, A, D, B]
自定义随机源
传入Random实例控制随机性,固定种子可复现结果(如测试场景)。
示例:Random random = new Random(42); // 固定种子Collections.shuffle(list, random); // 每次运行结果相同
从列表末尾开始,随机选择一个当前元素及其之前的元素(包括自身)。
交换这两个元素的位置。
向前移动一位,重复上述过程,直到处理完所有元素。
公平性:每个排列的概率均等。
效率:时间复杂度为O(n),仅需一次遍历。
适用集合类型
仅支持实现了List接口的集合(如ArrayList、LinkedList)。
不可直接用于Set或Map,需先转为List。
集合要求
可修改性:集合必须支持set()操作,否则抛出UnsupportedOperationException。
无null值:部分实现不允许null元素(推荐避免使用)。
空或单元素集合:无实际效果,但不会报错。
打乱数组:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Collections.shuffle(numbers);复现固定顺序(测试用):
Random random = new Random(100);List<String> cards = new ArrayList<>(Arrays.asList("A", "B", "C"));Collections.shuffle(cards, random); // 每次运行结果相同转换Set为List后打乱:
Set<String> set = new HashSet<>(Arrays.asList("X", "Y", "Z"));List<String> list = new ArrayList<>(set);Collections.shuffle(list);Collections.shuffle()是Java中高效、公平的列表随机排序工具,基于Fisher-Yates算法实现。通过自定义Random实例可控制随机性,适用于需要随机排列的场景(如游戏、抽样等),但需注意集合类型限制和线程安全问题。