【发布时间】:2011-03-10 22:53:02
【问题描述】:
我需要遍历 Hashmap 以检索存储在其中的值。
作为奖励,我还有一个键列表。因此,我可以选择使用迭代器或通过 for 循环中的随机访问来迭代它。这两个选项中的哪一个会提供更好的执行方式?
【问题讨论】:
-
你的目标是什么?找到特定键的值?用一堆值做一些有意义的事情(比如取它们的总和)?或者复制特定的价值观? ...?
我需要遍历 Hashmap 以检索存储在其中的值。
作为奖励,我还有一个键列表。因此,我可以选择使用迭代器或通过 for 循环中的随机访问来迭代它。这两个选项中的哪一个会提供更好的执行方式?
【问题讨论】:
没有真正的区别,但如果您通过调用 map.keySet() 获取键列表,那么最简单的方法是遍历 entrySet():
for (Map.Entry<K, V> entry : map.entrySet()) {
...
}
这样您就可以避免既要构建一组键,又要然后查找每个键的值。
【讨论】:
for (Object O : TheMap.values()) {
// Do something
}
【讨论】:
直观地说,我会说使用迭代器,因为它可能不需要任何查找,并且只为您提供直接的 O(n) 性能。请注意,您的最佳案例性能将是 O(n),因为您正在触及集合的每个元素,并且您的平均案例性能将是 O(n) 乘以您的访问方法的 big-O。由于哈希查找具有 O(1) 的高概率,您很可能仍然是 O(n),但是使用迭代器,因为您只是在计算下一个位置,所以(我认为)保证 O(1) 访问为下一个元素。这就是为什么我会选择迭代器。加上下一个元素计算的恒定时间可能比通过哈希查找位置的恒定时间更好。
【讨论】:
如果您只需要值而不需要知道键和值之间的关系,那么迭代器会更快,因为您可以节省计算键的值的时间。
【讨论】: