以下程序是否可以保证在将来的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版本都不会无用。
答案 0 :(得分:6)
正如你所说,没有明确的保证。
另一方面,单独的Collections.shuffle(List,Random)
的存在表明,当在同一状态下使用Random
调用时,此方法将始终返回相同的顺序。 (例如,这对于创建可重复的测试非常有用。)
所以这有点灰色。
但是如果核心功能依赖于它并且您想要绝对确定,那么您可以自己实现Fisher-Yates algorithm(或者更确切地说,更有效的Durstenfeld算法),这很简单。它非常简单,绝对不值得承担Collections.shuffle()
未来发生变化的风险(可能很小)。
答案 1 :(得分:2)
在大型开发商店中,有一件事总是在我身上钻出来,一旦记录出某种行为方式,最好总是这样做,除非你想要遭受客户的愤怒。
相反,如果没有记录某些内容,客户就不会期望它应该保持不变。
我认为这完全属于第二类,Java文档不做任何保证。
因此,如果您需要这样的保证,那么您最安全的选择就是编写自己的改组代码。