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

时间:2015-07-30 09:34:31

标签: 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));
  }
}

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

所以这有点灰色。

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

答案 1 :(得分:2)

在大型开发商店中,有一件事总是在我身上钻出来,一旦记录出某种行为方式,最好总是这样做,除非你想要遭受客户的愤怒。

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

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

因此,如果您需要这样的保证,那么您最安全的选择就是编写自己的改组代码。