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

Is there any guarantee that the algorithm behind java.util.Collections.shuffle() remains unchanged in future Java releases?

以下程序是否保证在未来的 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));
  }
}

java.util.Random class 的 javadoc 保证如果在以后所有 [=23] 中使用相同的种子初始化,它将始终 return 相同的随机数=] 发布。

但是java.util.Collections.shuffle()效用函数背后的算法是否有任何保证?这个实用函数的 Javadoc 对此没有任何说明。

我需要这个保证,因为我想确保持久化数据不会对任何未来的 java 版本无用。

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

另一方面,单独的 Collections.shuffle(List,Random) 的存在表明其意图是当使用 Random 在相同的状态。 (这对于创建可重复的测试很有用。)

所以这是一个灰色地带。

但是如果核心功能依赖于它并且你想绝对确定,你可以自己实现 Fisher-Yates algorithm(或者更有效的 Durstenfeld 算法),这很简单。如此简单,绝对不值得冒 Collections.shuffle() 将来会发生变化的(可能很小的)风险。

我在大型开发公司一直被灌输的一件事是,一旦某件事被记录为以某种方式运行,它最好始终以这种方式运行,除非你想遭受客户的愤怒。

相反,如果没有记录某些内容,客户就不会期望它应该保持不变。

我认为这完全属于第二类,Java 文档不作任何保证。

因此,如果您需要这样的保证,最安全的做法是编写自己的改组代码。