【问题标题】:What does deterministic mean?确定性是什么意思?
【发布时间】:2011-04-03 23:32:09
【问题描述】:

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

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

确定性是什么意思?

【问题讨论】:

标签: java deterministic


【解决方案1】:

HashMap不维护你添加的顺序,如果你希望你的输出是你添加的顺序,你应该使用LinkedHashMap,所以deterministic意味着你添加的有序输出。

这是一个例子: 1.非确定性

    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.确定性

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}

【讨论】:

  • 确定性并不意味着您按照添加它们的顺序将它们取出。相反,这意味着对于同一组值,您将始终以相同的顺序将它们取出。
【解决方案2】:

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

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

在大多数情况下,这样做的原因是对一些可能因平台和/或访问顺序而异的实现细节有一定的依赖性。而后者可能反过来由线程调度和事件时序决定,而这些都是天生不可预测的。

在大多数情况下,在任何单独的平台上以及使用最常见的线程模型(单线程应用程序)时,如果您总是在序列 X 中插入和删除一组特定的东西,那么您总是会在序列 Y 中取出它们。只是 Y 将完全依赖于 X,在平台上,甚至没有必要考虑它会是什么。

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

【讨论】:

  • +1 用于区分“真正随机”和“在给定环境中预先确定但不可预测”
【解决方案3】:

Non-deterministic 意味着没有一个结果可以让您事先弄清楚。算术表达式,如 1 + 2 或 log e,是确定性的。只有一个正确答案,您可以提前弄清楚。将一把沙子扔到空中,每一粒沙子的落下位置实际上对于任何主要的准确度都是不确定的。

这可能并不完全正确,因为您可以查看底层库和 JVM 实现的源代码,并且可能可以通过某种方式确定将产生的顺序。对他们来说,“不保证特定的顺序”或类似的话可能更正确。

在这种情况下,相关的是您不能依赖排序。

【讨论】:

    【解决方案4】:

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

    在 HashMap 的情况下,取决于您插入元素的方式,您可能具有一种或其他迭代顺序。

    【讨论】:

      【解决方案5】:

      简单来说:当您调用keys()、values() 或entrySet() 时,您会得到一个可以迭代的集合。那句话是说你不能期望迭代器返回对象的顺序是任何特定的顺序。特别是,它可以不同于插入顺序和键值的自然排序。

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

      【讨论】:

        【解决方案6】:

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

        我找到了一个很好的例子:

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

        可以有两种解释:

        * 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.
        

        【讨论】:

          【解决方案7】:

          最简单的定义:

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

          上面的意思是,遍历完全相同的 HashMap 可能会在不同的时间给出不同的结果,即使您没有更改任何内容。通常这无关紧要,但如果确实如此,您应该使用 LinkedHashMap。

          【讨论】:

          • S. Lott - 函数f 的“幂等”意味着f(f(x))=f(x) 对于所有x。 “确定性”是一个不同的概念。
          • 让我再试一次。这听起来像是“无滞后”的定义——结果与没有隐含记忆一致。
          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              确定性:可以确定
              non-deterministic : 无法确定

              【讨论】:

                【解决方案11】:

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

                由于散列的工作方式,地图中的元素被“打乱”到任意位置。加扰位置不能轻易预先确定——它们是不可确定的——你不知道结果的顺序。

                【讨论】:

                  猜你喜欢
                  • 2012-03-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-08-12
                  • 2017-06-11
                  • 2018-03-05
                  相关资源
                  最近更新 更多