9

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

任何人都可以解释为什么它说跟随?

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

重新散列期间订单是否会改变,这就是为什么?

如果您能向我指出表现出这种不保证订单保持不变的行为的资源或集合列表,那也很好。

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

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

4

4 回答 4

13

HashMap没有顺序 - 在任何时候。它实际上不用于此目的。即使不重新散列,顺序也可能会改变。

如果您需要订单保持不变,请使用 LinkedHashMap

于 2013-02-04T13:09:17.797 回答
5

散列策略的要点是以伪随机方式放置对象。这样做是为了在大多数情况下,只有一个键/元素会被散列到给定的存储桶中。这允许 O(1) 查找时间。当 HashMap 或 Hashtable 增长时,桶的数量会发生变化,并且键/元素会以另一种伪随机方式放置。

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

顺便说一句,如果您对少量键可以有多少个订单感兴趣,那么哈希集合中的元素顺序

于 2013-02-04T13:22:08.140 回答
4

对我来说,以下代码:

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)时发生的重新散列,顺序发生了变化。即使再次删除了额外的条目,原始订单也不会恢复。

于 2013-02-04T13:15:32.547 回答
1

HashMap 有许多存储条目的桶(实现为数组)。

当一个项目被添加到地图时,它被分配到一个基于其 hashCode 的值和 HashMap 的桶大小的桶。(请注意,桶可能已经被占用,这称为冲突。处理得当且正确,但我将忽略该处理的描述,因为它不会改变概念)。

为什么 HashMap 不保证地图的顺序会随着时间的推移保持不变

于 2013-02-04T13:09:22.617 回答