我正在阅读Java Hashmap文档,但我不明白这句话。
请注意迭代顺序 HashMap是非确定性的。如果你 想要确定性迭代,请使用 LinkedHashMap的。
确定性意味着什么?
答案 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}