代码之家  ›  专栏  ›  技术社区  ›  Nathan Schwermann

确定性是什么意思?

  •  33
  • Nathan Schwermann  · 技术社区  · 14 年前

    我正在阅读Java哈希地图文档,但我不理解这个句子。

    注意的迭代顺序 哈希映射是不确定性的。如果你 需要确定性迭代,使用 LinkedHashMap。

    确定性是什么意思?

    11 回复  |  直到 14 年前
        1
  •  41
  •   bukzor    14 年前

    最简单的定义:

    如果输入相同,您 总是 获得相同的输出。

    上面说,通过完全相同的hashmap迭代可能在不同的时间产生不同的结果,即使您没有更改任何内容。通常这没关系,但如果有关系,你应该使用Linkedhashmap。

        2
  •  13
  •   S.Lott    14 年前

    以可以预先“确定”的顺序。

    由于散列的工作方式,地图中的元素被“扰乱”到任意位置。混乱的位置不容易提前确定——它们不可确定——你不知道结果的顺序。

        3
  •  8
  •   Jim Garrison    14 年前

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

    如果希望迭代器按插入顺序工作,请使用LinkedHashMap。如果要按键值迭代,请使用treemap。请注意,这两种方法的性能都比普通的hashmap稍差,因为它们都需要做额外的工作来跟踪顺序。

        4
  •  8
  •   walkytalky    14 年前

    严格来说,hashmap迭代顺序几乎可以肯定 不确定性。就像绝大多数的计算过程一样,如果你通过它 确切地 同样,结果也会完全相同。一个真正的非确定性系统会包含一些外部的随机元素,这在这里是不太可能的。至少在大多数情况下。

    他们什么 真正地 我认为,这是因为映射包含一组特定的元素,所以您不应该期望当您对它们进行迭代时,它们会以特定的顺序出现。这并不意味着迭代的顺序是 随机的 这仅仅意味着作为一个开发者,你不应该指望知道它是什么。

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

    在大多数情况下,在任何一个单独的平台上,使用最常见的线程模型——单线程应用程序——如果你总是按顺序x插入和删除一组特定的东西,你总是按顺序y把它们取出来。只是y将如此精确地依赖于x,而在平台上,甚至没有必要考虑太多这将是什么。

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

        5
  •  5
  •   µBio    14 年前

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

        6
  •  3
  •   Abe Miessler    14 年前

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

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

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

    它可以用两种方式解释:

    * 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
  •  2
  •   StuartLC    14 年前

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

        8
  •  2
  •   Jesse Millikan    14 年前

    非确定性 也就是说,没有一个结果可以事先得到。算术表达式(如1+2或log e)是确定性的。只有一个正确的答案,你可以提前知道。把一把沙子扔到空中,每粒沙子落在哪里 有效地 任何主要精度的不确定性。

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

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

        9
  •  0
  •   Fazal    14 年前

    这是hashmap的属性,元素不会按照与hashmap不按顺序插入元素相同的顺序进行迭代。因此,文档中的行

        10
  •  0
  •   jdehaan    14 年前

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

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

        11
  •  -4
  •   jason    14 年前

    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}