相同哈希映射的提取值的顺序是否相同?

时间:2015-04-16 14:53:23

标签: java

当第一次返回时,hashMapObj.values()在第n次调用时是否以相同的顺序返回列表?

据我所知,值的顺序与插入顺序不同。但是,即使多次调用values()而没有改变hashMap,订单也会有所不同吗?

4 个答案:

答案 0 :(得分:2)

  

此课程不保证地图的顺序;在   特别是,它不保证订单将保持不变   随着时间的推移

http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#values()

你不能等待()会以相同的顺序返回列表,它可能会发生,但这不是一个好主意,因为它取决于实现

答案 1 :(得分:2)

HashMap无法保证在迭代Collection.values()时迭代其值的顺序。只有它们是同步的:

  

返回此地图中包含的值的Collection视图。该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。该集合支持元素删除,它通过Iterator.remove,Collection.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。它不支持add或addAll操作。

docs

如果您的元素具有可比性,则可以接受速度惩罚。您始终可以将值排序到另一个集合中,然后获得确定性顺序。


另一个答案是关于密钥的顺序,这里与此无关。

答案 2 :(得分:1)

答案取决于对values()的两次调用之间发生的情况:

  • 如果未对HashMap<K,V>进行任何修改,则顺序将相同,因为用于遍历哈希映射的桶的算法不具有随机分量。对于插入到地图中的项目,顺序是任意的,但在迭代之间保持不变。
  • 如果您对地图进行了修改,即使地图内容保持不变,订单也可能会发生变化(例如,因为您删除并重新插入某个项目,或者插入然后删除某个项目)。

删除重新插入项可以更改同一个哈希桶中项的顺序,因此values()的迭代顺序会相应更改。

插入项目可能会增加缓存存储区和重新散列的数量,这在删除相同项目时不会撤消。这也会改变values()的顺序。

答案 3 :(得分:0)

不能保证,你需要一个TreeMap:

https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html