Java HashMap keySet() 迭代顺序是否一致?

2022-08-31 11:44:09

我理解从Map的keySet()方法返回的Set不保证任何特定的顺序。

我的问题是,它是否保证了多次迭代的相同顺序。例如

Map<K,V> map = getMap();

for( K k : map.keySet() )
{
}

...

for( K k : map.keySet() )
{
}

在上面的代码中,假设映射被修改,则对 keySets 的迭代将按相同的顺序进行。使用Sun的jdk15,它确实以相同的顺序迭代,但在我依赖这种行为之前,我想知道是否所有的JDK都会做同样的事情。

编辑

我从答案中看到我不能依赖它。太糟糕了。我希望不必建立一些新的收藏来保证我的订购。我的代码需要迭代,执行一些逻辑,然后使用相同的顺序再次迭代。我将从 keySet 创建一个新的 ArrayList,这将保证顺序。


答案 1

如果您想要迭代顺序不变的哈希图,则可以使用LinkedHashMap

此外,如果循环访问集合,则应始终使用它。迭代HashMap的条目Set或keySet比LinkedHashMap的要慢得多。


答案 2

如果在 API 文档中未声明要保证,则不应依赖它。该行为甚至可能从 JDK 的一个版本更改为下一个版本,甚至从同一供应商的 JDK 中也是如此。

你可以很容易地得到这个集合,然后自己排序,对吧?