【发布时间】:2011-04-03 23:32:09
【问题描述】:
我正在阅读 Java Hashmap 文档,但我不明白这句话。
注意迭代顺序 HashMap 是不确定的。如果你 想要确定性迭代,使用 LinkedHashMap。
确定性是什么意思?
【问题讨论】:
-
您可以依赖它们按任何顺序排列。
标签: java deterministic
我正在阅读 Java Hashmap 文档,但我不明白这句话。
注意迭代顺序 HashMap 是不确定的。如果你 想要确定性迭代,使用 LinkedHashMap。
确定性是什么意思?
【问题讨论】:
标签: java deterministic
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}
【讨论】:
严格来说,HashMap 的迭代顺序几乎肯定是不是不确定的。与绝大多数计算过程一样,如果您以完全相同相同的方式进行处理,结果将完全相同。一个真正的非确定性系统将包含一些外部随机元素,这在此处不太可能出现。至少在大多数情况下。
我认为它们真正的意思是,仅仅因为地图包含一组特定的元素,你不应该期望当你迭代它们时它们会以特定的顺序出现.这并不意味着迭代的顺序是随机的,它只是意味着作为开发人员你不应该指望知道它是什么。
在大多数情况下,这样做的原因是对一些可能因平台和/或访问顺序而异的实现细节有一定的依赖性。而后者可能反过来由线程调度和事件时序决定,而这些都是天生不可预测的。
在大多数情况下,在任何单独的平台上以及使用最常见的线程模型(单线程应用程序)时,如果您总是在序列 X 中插入和删除一组特定的东西,那么您总是会在序列 Y 中取出它们。只是 Y 将完全依赖于 X,在平台上,甚至没有必要考虑它会是什么。
基本上,即使它不是随机的,也可能是随机的。
【讨论】:
Non-deterministic 意味着没有一个结果可以让您事先弄清楚。算术表达式,如 1 + 2 或 log e,是确定性的。只有一个正确答案,您可以提前弄清楚。将一把沙子扔到空中,每一粒沙子的落下位置实际上对于任何主要的准确度都是不确定的。
这可能并不完全正确,因为您可以查看底层库和 JVM 实现的源代码,并且可能可以通过某种方式确定将产生的顺序。对他们来说,“不保证特定的顺序”或类似的话可能更正确。
在这种情况下,相关的是您不能依赖排序。
【讨论】:
非确定性意味着没有明确定义的行为。
在 HashMap 的情况下,取决于您插入元素的方式,您可能具有一种或其他迭代顺序。
【讨论】:
简单来说:当您调用keys()、values() 或entrySet() 时,您会得到一个可以迭代的集合。那句话是说你不能期望迭代器返回对象的顺序是任何特定的顺序。特别是,它可以不同于插入顺序和键值的自然排序。
如果您希望迭代器按插入顺序工作,请使用 LinkedHashMap。如果要按键值迭代,请使用 TreeMap。请注意,这两者的性能都比普通的 HashMap 稍差,因为它们都必须做额外的工作来跟踪顺序。
【讨论】:
这是一种算法,当给定特定输入时会产生相同的输出。
我找到了一个很好的例子:
考虑一个购物清单:一个清单 要购买的物品。
可以有两种解释:
* 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.
【讨论】:
最简单的定义:
给定相同的输入,您总是得到相同的输出。
上面的意思是,遍历完全相同的 HashMap 可能会在不同的时间给出不同的结果,即使您没有更改任何内容。通常这无关紧要,但如果确实如此,您应该使用 LinkedHashMap。
【讨论】:
f 的“幂等”意味着f(f(x))=f(x) 对于所有x。 “确定性”是一个不同的概念。
这是 HashMap 的属性,其中元素的迭代顺序与插入的顺序不同,因为 HashMap 不会按顺序插入元素。因此文档中的行
【讨论】:
确定性意味着结果是可预测/可预见的。
【讨论】:
确定性:可以确定
non-deterministic : 无法确定
【讨论】:
按照可以提前“确定”的顺序。
由于散列的工作方式,地图中的元素被“打乱”到任意位置。加扰位置不能轻易预先确定——它们是不可确定的——你不知道结果的顺序。
【讨论】: