Java.util.Collections.shuffle()的算法在未来的Java版本中是否保持不变?

6

以下程序是否保证在未来的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版本中无用。


1
你想要持久什么?这对我来说听起来是一个非常奇怪的要求。 - Jon Skeet
这个通用指南对您也可能有所帮助 https://docs.oracle.com/javase/tutorial/collections/interoperability/api-design.html - Laurentiu L.
3
@Daniel,除非它们已经被记录在某个地方,否则它们真的不能被称为保证 :-) - paxdiablo
1
@DanielK:恐怕我不会读350行Javascript代码来理解你为什么认为它是必需的。请在问题中添加适当的上下文——我强烈怀疑没有真正的必要性。 - Jon Skeet
1
@DanielK:一个方法的实现如何确定该方法是否必需?方法的实现无法解释为什么要调用它-因为这段代码没有任何注释,也没有任何理由。我很高兴你得到了所需的反馈,但我仍然敦促你重新考虑是否真的应该这样做。 - Jon Skeet
显示剩余14条评论
2个回答

6

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

另一方面,存在一个单独的 Collections.shuffle(List,Random) 方法表明,这个方法的意图是当使用相同状态的Random时,总是返回相同的顺序。(例如,这对于创建可重复的测试很有用。)

因此,这是一个灰色地带。

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


2
在大型开发公司工作时,我一直被灌输的一件事情是,一旦某个行为被记录为某种方式,它最好始终保持这种方式,除非你想遭受客户的愤怒。
相反,如果某些东西没有被记录,客户就没有期望它应该保持不变。
我认为这完全属于第二类,Java文档没有做出任何保证。
因此,如果您需要这样的保证,最安全的选择是编写自己的洗牌代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接