确定性是什么意思?

时间:2010-08-25 21:35:43

标签: java deterministic

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

  

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

确定性意味着什么?

11 个答案:

答案 0 :(得分:41)

最简单的定义:

给定相同的输入,总是获得相同的输出。

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

答案 1 :(得分:13)

可以提前“确定”的顺序。

由于哈希的工作方式,地图中的元素被“加扰”到任意位置。加扰位置不能提前确定 - 它们无法确定 - 您不知道最终的订单。

答案 2 :(得分:8)

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

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

答案 3 :(得分:8)

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

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

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

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

基本上,即使不是随机,也可能是。

答案 4 :(得分:5)

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

答案 5 :(得分:3)

这是一种算法,当给定特定输入时,将产生相同的输出。

我发现了一个很好的例子:

  

考虑购物清单:清单   要买的物品。

     

可以用两种方式解释:

* The instruction to buy all of those items, in any order. 
   This is a nondeterministic algorithm.
* The instruction to buy all of those items, in the order given. This is a 
   deterministic algorithm.

答案 6 :(得分:2)

确定性意味着结果是可预测/可预见的。

答案 7 :(得分:2)

非确定性表示没有一个结果可以预先弄清楚。算术表达式,如1 + 2或log e,是确定性的。只有一个正确答案,你可以预先弄清楚。在空中投掷少量沙子,每个谷物落下的地方有效地非确定性,无论在何种程度上都是准确的。

这可能并不完全正确,因为您可以查看底层库和JVM实现的源代码,并且可能可以通过某种方式确定可能导致的排序。对他们说“没有特定的顺序得到保证”或类似的东西可能更为正确。

在这种情况下,相关的是你不能依赖订购。

答案 8 :(得分:0)

这是HashMap的属性,其中元素的迭代次数与插入的顺序不同,因为HashMap不按顺序插入元素。因此文档中的行

答案 9 :(得分:0)

非确定性意味着没有明确定义的行为。

对于HashMap,取决于您插入元素的方式,您可能具有迭代的一个或其他顺序。

答案 10 :(得分:-4)

HashMap不会维护您添加的顺序,如果您希望输出是您添加的顺序,则应使用LinkedHashMap,因此deterministic表示按顺序输出您添加的内容。

以下是示例: 1.non确定性

    HashMap<String, Integer> map = new HashMap<String,Integer>();
    map.put("a",5);
    map.put("b",16);
    map.put("c",46);
    System.out.println(map); //ouptput:{a=5, c=46, b=16}

2.deterministic

HashMap<String, Integer> map = new LinkedHashMap<String,Integer>();
            map.put("a",5);
            map.put("b",16);
            map.put("c",46);
            System.out.println(map); //output:{a=5, b=16, c=46}