【发布时间】:2018-05-01 14:42:30
【问题描述】:
我在介绍 Java 中的 Hash Map 时发现 Hash Map 是无序和无序的。因此,在使用System.out.println(HM) 打印时,我们应该以任意键顺序获取映射。比如下面的代码
HashMap<Integer,String> HM = new HashMap<>();
HM.put(16,"hello16");
HM.put(6, "hello6");
HM.put(1, "hello1");
打印{16=hello16, 1=hello1, 6=hello6},这是一个明显随机的键顺序。但是当我用HM.put(15,"hello15"); 替换HM.put(16,"hello16"); 时,它会以键的自然顺序打印映射,is surprising and seems unlikely by chance:
{1=hello1, 6=hello6, 15=hello15}
我问了一个朋友,他说这与HashMap的初始容量(=16)有关,但他无法解释清楚。谁能用这个特定的例子解释输出中的这种差异。
【问题讨论】:
-
为什么会发生这种情况并不重要,因为您不应该依赖它。在 Java 9 中,
Set#of和Map#of的插入顺序是随机的。 -
@RomanPuchkovskiy OP 在问题“...打印使用 System.out.println(HM) 时说。...”
-
“所以我们应该以随机的键顺序获取映射” - 不。 HashMap 不承诺随机顺序。它根本不承诺订单将是什么。
-
今天它可能会被内部存储桶订购。下一个版本,它可以像 Go 一样随机化。在别人的机器上,它可能像新的 Python dict 实现一样是按插入排序的。
-
“似乎不太可能是偶然的”:您有六分之一的机会 3 个值按自然顺序排列,而您花了一次机会却没有得到。