为什么HashMap不能保证map的顺序随着时间的推移保持不变

问题描述 投票:0回答:5

我在这里阅读有关 Hashmap 和 Hashtable 之间的区别: http://javarevisited.blogspot.sg/2010/10/difference- Between-hashmap-and.html

任何人都可以解释为什么它说以下吗?

“5.HashMap不保证map的顺序随着时间的推移保持不变。”

重新哈希时顺序是否会改变,这就是原因吗?

如果您能给我指出表现出不保证顺序保持不变的行为的资源或收藏列表,那就太好了。

AFIK,ArrayList 给出了这样的保证(如果我错了请告诉我)

编辑:“地图顺序”=可能是输入键或值的顺序。

java hashmap
5个回答
15
投票

A HashMap 在任何时候都没有顺序。它实际上并不用于此目的。即使不重新散列,顺序也可能会改变。 如果您需要顺序保持不变,请使用

LinkedHashMap


6
投票

最简单的解决方案是使用 LinkedHashMap。这将保留添加顺序或可选的上次访问顺序。我更喜欢使用这个集合,因为它使调试更容易,因为我可以预测对象可能在哪里,有时添加对象的顺序可能是有用的信息。

顺便说一句,如果您对少量键可以有多少顺序感兴趣

哈希集合中元素的顺序


5
投票

Map <Integer, Object> map = new HashMap <Integer, Object> (4); map.put (60, null); map.put (48, null); map.put (29, null); System.out.println (map); map.put (47, null); map.put (15, null); map.put (53, null); map.remove (47); map.remove (15); map.remove (53); System.out.println (map);

输出:

{29=null, 48=null, 60=null} {48=null, 29=null, 60=null}

由于超出初始容量(此处为 4)时会发生重新哈希,因此顺序发生了变化。即使再次删除附加条目,也不会恢复原始顺序。


1
投票

当一个项目添加到映射中时,它会根据其 hashCode 派生的值和 HashMap 的存储桶大小分配给存储桶。 (请注意,存储桶可能已被占用,这称为碰撞。处理得优雅且正确,但我将忽略描述的处理,因为它不会改变概念)。

为什么HashMap不能保证map的顺序随着时间的推移保持不变


0
投票

Map <String, Integer> map = new HashMap <> (); map.put ("Apple", 250); map.put ("Pear", 120); map.put ("Papaya", 60); System.out.println (map);

向映射添加条目时,每个键可能会生成(考虑到我们有一个良好的哈希函数)一个不同的整数。
假设 Apple 生成 4,Pear 生成 3,Papaya 生成 0。
因此,在内部,木瓜的索引为 0,泥炭的索引为 3,苹果的索引为 4。
因此,当您尝试打印 hashMap 中的值时,它的顺序将与插入的顺序不同。

© www.soinside.com 2019 - 2024. All rights reserved.