当第一次返回时,hashMapObj.values()在第n次调用时是否以相同的顺序返回列表?
据我所知,值的顺序与插入顺序不同。但是,即使多次调用values()而没有改变hashMap,订单也会有所不同吗?
答案 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操作。
如果您的元素具有可比性,则可以接受速度惩罚。您始终可以将值排序到另一个集合中,然后获得确定性顺序。
另一个答案是关于密钥的顺序,这里与此无关。
答案 2 :(得分:1)
答案取决于对values()
的两次调用之间发生的情况:
HashMap<K,V>
进行任何修改,则顺序将相同,因为用于遍历哈希映射的桶的算法不具有随机分量。对于插入到地图中的项目,顺序是任意的,但在迭代之间保持不变。删除重新插入项可以更改同一个哈希桶中项的顺序,因此values()
的迭代顺序会相应更改。
插入项目可能会增加缓存存储区和重新散列的数量,这在删除相同项目时不会撤消。这也会改变values()
的顺序。
答案 3 :(得分:0)
不能保证,你需要一个TreeMap:
https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html