我正在读关于HashMap和Hashtable的区别就在这里: http://javarevisited.blogspot.sg/2010/10/difference-between-hashmap-and.html
任何人都可以扔,为什么它说以下一些轻?
“5. HashMap不能保证映射的顺序将随着时间保持不变。”
可以重新散列时的顺序变化,这是为什么呢?
这也将是很好,如果你可以点我的资源或谁表现出不保证为了成为这种行为的集合清单保持不变。
AFIK,ArrayList中给出了这样出示担保(让我知道,如果我错了)
编辑:“地图的订单” =也许顺序被输入键或值。
一个HashMap中没有秩序-在任何时间。 它实际上没有用于这一目的。 不是老调重弹时,顺序可能甚至改变。
如果您需要的顺序保持不变,使用LinkedHashMap的
哈希策略的要点是将对象放置在一个伪随机的方式。 它这样做是让大部分的时间,只需一个键/元素将被散列到给定存储桶。 这允许O(1)查找时间。 当一个HashMap或哈希表的增长,水桶变化和键的数目/元件被放置在另一伪随机方式。
这个最简单的解决方法是使用LinkedHashMap的。 这将保持增加或上次访问可选顺序的顺序。 我更喜欢,因为它使调试更加简单,因为我可以预言,其中一个目标很可能是,有时添加对象的顺序可能是有用的信息,使用此集合。
BTW如果你有兴趣在按键数量少多少订单可以在哈希集合元素的顺序
对我来说,下面的代码:
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)若超过初始容量出现这种情况的。 即使其他条目将再次删除,原来的顺序是不可恢复的。
甲HashMap具有桶的在其中存储条目数目(作为一个数组实现)。
当一个项目被添加到地图,它被分配给基于衍生其的hashCode和HashMap中的桶大小的值的桶。 (请注意,它有可能是桶已经被占用,这就是所谓的碰撞。这是正常和正确处理,但我会忽略处理的描述,因为它不会改变的概念)。
为什么HashMap不能保证映射的顺序将保持不变随着时间的推移
文章来源: Why HashMap does not guarantee that the order of the map will remain constant over time