如果有人仍然对详细且有数字支持的答案感兴趣:是的,您应该使用vs。 如果您正在迭代整个地图。有关详细数字,请参阅此要点。我使用JMH运行了一个基准测试,用于使用Oracle JDK8的Map的默认实现。entrySet()
keySet()
主要发现是:迭代并重新查询每个键总是有点慢。一旦你有更大的地图,乘数就会变得相当大(例如,对于a,它总是5-10x;而对于s,它不大于2x,最多一百万个条目)。keySet
ConcurrentSkipListMap
HashMap
但是,这些仍然是非常小的数字。迭代超过100万个条目的最慢方法是使用 ,大约500-700毫秒;而迭代只是25-30毫秒,后面是40-50毫秒(这并不奇怪,因为它里面有一个,这有助于迭代)。作为上面链接的要点的概述:ConcurrentSkipListMap.keySet()
IdentityHashMap.entrySet()
LinkedHashMap.entrySet()
LinkedList
Map type | Access Type | Δ for 1M entries
----------------------+-------------+-----------------
HashMap | .entrySet() | 69-72 ms
HashMap | .keySet() | 86-94 ms
ConcurrentHashMap | .entrySet() | 72-76 ms
ConcurrentHashMap | .keySet() | 87-95 ms
TreeMap | .entrySet() | 101-105 ms
TreeMap | .keySet() | 257-279 ms
LinkedHashMap | .entrySet() | 37-49 ms
LinkedHashMap | .keySet() | 89-120 ms
ConcurrentSkipListMap | .entrySet() | 94-108 ms
ConcurrentSkipListMap | .keySet() | 494-696 ms
IdentityHashMap | .entrySet() | 26-29 ms
IdentityHashMap | .keySet() | 69-77 ms
所以底线是:这取决于你的用例。虽然迭代数字肯定更快,但数字并不大,特别是对于相当小的地图。但是,如果您经常迭代具有100万个条目的Map,最好使用更快的方法;)entrySet()
当然,这些数字只是为了相互比较,而不是绝对的。