有没有保证java.util.Collections.shuffle()背后的算法在未来的Java版本中保持不变?

Dan*_* K. 6 java random shuffle

以下程序是否保证在将来的java版本中生成具有相同内容和排序的列表?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Test {
  public static void main(String[] args) {
    List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
    Collections.shuffle(list, new Random(42));
  }
}
Run Code Online (Sandbox Code Playgroud)

java.util.Random该类的javadoc 保证,如果在将来的所有Java版本中使用相同的种子进行初始化,它将始终返回相同的随机数.

但对于java.util.Collections.shuffle()效用函数背后的算法有什么保证吗?这个实用程序函数的Javadoc没有说明这一点.

我需要这个保证,因为我想确保持久化数据对于将来的任何Java版本都不会无用.

biz*_*lop 6

正如你所说,没有明确的保证.

另一方面,单独存在Collections.shuffle(List,Random)意味着该方法在使用a调用时将始终返回相同的顺序Random在以相同状态.(例如,这对于创建可重复的测试非常有用.)

所以它有点像灰色区域.

但是如果核心功能依赖于它并且您想要绝对确定,那么您可以自己实现Fisher-Yates算法(或者更确切地说,更有效的Durstenfeld算法),这很简单.它非常简单,绝对不值得承担Collections.shuffle()将来会发生变化的(可能很小的)风险.