确定性是什么意思?

Nat*_*ann 34 java deterministic

我正在阅读Java Hashmap文档,但我不明白这句话.

请注意,HashMap的迭代顺序是非确定性的.如果您想要确定性迭代,请使用LinkedHashMap.

确定性是什么意思?

buk*_*zor 42

最简单的定义:

给定相同的输入,您总是得到相同的输出.

上面,它表示迭代完全相同的HashMap可能会在不同的时间给出不同的结果,即使你没有改变任何东西.通常这无关紧要,但如果确实如此,则应使用LinkedHashMap.

  • S. Lott - 函数`f`的"幂等",意味着所有`x`的`f(f(x))= f(x)`."确定性"是一个不同的想法. (2认同)

S.L*_*ott 13

按照可以提前"确定"的顺序.

由于哈希的工作方式,地图中的元素被"扰乱"到任意位置.加扰位置不能提前确定 - 它们是不可确定的 - 您不知道产生的顺序.


Jim*_*son 8

简单来说:当你调用keys(),values()或entrySet()时,你会得到一个可以迭代的集合.该行表示您不能指望迭代器返回对象的顺序将是任何特定顺序.特别是,它可以通过键值与插入顺序和自然排序不同.

如果希望迭代器按插入顺序工作,请使用LinkedHashMap.如果要按键值进行迭代,请使用TreeMap.请注意,这两者的性能都比普通的HashMap略差,因为它们都需要做额外的工作来跟踪顺序.


wal*_*lky 8

严格地说,HashMap迭代顺序几乎肯定不是非确定性的.像绝大多数计算过程一样,如果你以完全相同的方式完成它,结果将完全相同.一个真正的非确定性系统会包含一些外部随机元素,这种情况极不可能出现在这里.至少在大多数情况下.

我认为它们的真正含义是,仅仅因为地图包含一组特定的元素,你不应该期望当你迭代它们时它们会以特定的顺序出现.这并不意味着迭代的顺序是随机的,它只是意味着作为开发人员,你不应该知道它是什么.

在大多数情况下,其原因在于某些实现细节会有所依赖,这些细节可能因平台和/或访问顺序而异.而后者又可以由线程调度和事件定时来确定,这是天生不可预测的.

在大多数情况下,在任何单独的平台上,使用最常见的线程模型 - 单线程应用程序 - 如果你总是在序列X中插入和删除一组特定的东西,你将始终按顺序Y将它们输出.这只是Y将完全依赖于X,并且在平台上,即使考虑它将会是什么也没有意义.

基本上,即使它不是随机的,它也可能是.


µBi*_*Bio 5

确定性:可以确定
非确定性:无法确定