Nat*_*ann 34 java deterministic
我正在阅读Java Hashmap文档,但我不明白这句话.
请注意,HashMap的迭代顺序是非确定性的.如果您想要确定性迭代,请使用LinkedHashMap.
确定性是什么意思?
buk*_*zor 42
最简单的定义:
给定相同的输入,您总是得到相同的输出.
上面,它表示迭代完全相同的HashMap可能会在不同的时间给出不同的结果,即使你没有改变任何东西.通常这无关紧要,但如果确实如此,则应使用LinkedHashMap.
简单来说:当你调用keys(),values()或entrySet()时,你会得到一个可以迭代的集合.该行表示您不能指望迭代器返回对象的顺序将是任何特定顺序.特别是,它可以通过键值与插入顺序和自然排序不同.
如果希望迭代器按插入顺序工作,请使用LinkedHashMap.如果要按键值进行迭代,请使用TreeMap.请注意,这两者的性能都比普通的HashMap略差,因为它们都需要做额外的工作来跟踪顺序.
严格地说,HashMap迭代顺序几乎肯定不是非确定性的.像绝大多数计算过程一样,如果你以完全相同的方式完成它,结果将完全相同.一个真正的非确定性系统会包含一些外部随机元素,这种情况极不可能出现在这里.至少在大多数情况下.
我认为它们的真正含义是,仅仅因为地图包含一组特定的元素,你不应该期望当你迭代它们时它们会以特定的顺序出现.这并不意味着迭代的顺序是随机的,它只是意味着作为开发人员,你不应该知道它是什么.
在大多数情况下,其原因在于某些实现细节会有所依赖,这些细节可能因平台和/或访问顺序而异.而后者又可以由线程调度和事件定时来确定,这是天生不可预测的.
在大多数情况下,在任何单独的平台上,使用最常见的线程模型 - 单线程应用程序 - 如果你总是在序列X中插入和删除一组特定的东西,你将始终按顺序Y将它们输出.这只是Y将完全依赖于X,并且在平台上,即使考虑它将会是什么也没有意义.
基本上,即使它不是随机的,它也可能是.
| 归档时间: | 
 | 
| 查看次数: | 7697 次 | 
| 最近记录: |