为什么Map实现会覆盖foreach?

时间:2013-12-21 23:48:07

标签: performance algorithm scala map

scala.collection.mutable.Map的{​​{3}}说。

  

最好覆盖方法foreachsize以提高效率。

覆盖size(可能)O(n)改为O(1)

但覆盖foreach的价值是什么?

2 个答案:

答案 0 :(得分:3)

scala.collection.immutable.MapLike中foreach的默认实现使用迭代器来实现foreach。此实现继承自IterableLike

def foreach[U](f: A => U): Unit =
  iterator.foreach(f)

但实现迭代器通常比实现foreach复杂得多。迭代器必须明确地跟踪当前位置,这需要状态,并且在树状结构的情况下可能需要大量逻辑,例如,什么用于不可变的HashMaps。下面是来自当前集合库的不可变HashMaps和HashSets的迭代器,作为示例TrieIterator。不是很简单,对吧?

另一方面,foreach方法使用调用堆栈来跟踪当前位置,因此实现起来非常简单和有效。二元树的foreach方法就在左边.foreach(f); right.foreach(F)。

因此,根据地图迭代器的复杂程度,为性能分别实现foreach可能确实是个好主意。

答案 1 :(得分:1)

我想这是因为你正在处理一个可变的Map。如果您对多个进程之间共享的可变集合进行了多次迭代,那么事情就会非常错误。例如,如果元素被删除但没有在迭代器中遍历,那么呢? foreach方法的默认实现(来自Iterator)不使用任何类型的并发处理。

相同的注释不会出现在不可变版本中。