我知道从Map的keySet()方法返回的Set并不保证任何特定的顺序。
我的问题是,它能保证在多次迭代中保持相同的顺序吗?例如
Map<K,V> map = getMap();
for( K k : map.keySet() )
{
}
...
for( K k : map.keySet() )
{
}
在上面的代码中,假设映射是而不是 modified,那么keySets上的迭代是否会以相同的顺序进行。使用Sun的jdk15 it 以相同的顺序进行迭代,但在我讨论此行为之前,我想知道是否所有JDK都会执行相同的操作。
编辑
我从答案中看出我不能依赖它。太可惜了。我希望不用建立一些新的收藏来保证我的订单。我的代码需要遍历,执行一些逻辑,然后以相同的顺序再次遍历。我只需要从keySet创建一个新的ArrayList来保证顺序。
发布于 2009-12-11 01:55:39
如果在API文档中没有声明它是有保证的,那么您就不应该依赖它。这种行为甚至可能在JDK的不同版本之间发生变化,甚至在同一供应商的JDK中也是如此。
您可以轻松地获取集合,然后自己对其进行排序,对吗?
发布于 2011-08-11 02:49:00
如果您想要一个迭代顺序不变的LinkedHashMap,您可以使用HashMap。
此外,如果您遍历集合,则应该始终使用它。在HashMap的entrySet或keySet上迭代要比在LinkedHashMap上慢得多。
发布于 2009-12-11 02:01:31
Map只是一个接口(而不是一个类),这意味着实现它的底层类(有很多)可能会有不同的行为,并且keySet()的约定并不表明需要一致的迭代。
如果你正在看一个实现映射(HashMap,LinkedHashMap,TreeMap等)的特定类,那么你可以看到它是如何实现keySet()函数的,通过检出源代码来确定行为是什么,你必须真正仔细观察算法,看看你正在寻找的属性是否被保留(即,当映射在迭代之间没有任何插入/删除时,一致的迭代顺序)。例如,HashMap的源代码在这里(打开JDK6):http://www.docjar.com/html/api/java/util/HashMap.java.html
从一个JDK到另一个JDK,它可能有很大的不同,所以我肯定不会依赖它。
也就是说,如果一致的迭代顺序是您真正需要的,那么您可能想尝试一下LinkedHashMap。
https://stackoverflow.com/questions/1882762
复制相似问题