是否可以保证 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 文档不作任何保证。
因此,如果您需要这样的保证,最安全的做法是编写自己的改组代码。
以下程序是否保证在未来的 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 文档不作任何保证。
因此,如果您需要这样的保证,最安全的做法是编写自己的改组代码。