不同集合类型的性能和使用比较

时间:2014-03-21 02:23:53

标签: scala scala-collections

我已经在Scala编程了几个月了。我仍然对许多不同的收藏品感到困惑。

是否有某个页面/文章显示每种类型最适合的内容?

Scala的问题在于它有太多不同的类型,然后你有类似于Array的东西,它直接映射到Java数组,然后你有类似" Set"这实际上是一个"特质"但是你可以像普通类一样使用它,即使我的理解是特性就像一个接口。文档说"要实现具体集,您需要定义以下方法:..."但实际上我可以使用它。

整件事让我很困惑。来自C#/ .NET,事情很清楚,我没有像#34; LinkedHashMap"这样的奇怪类型。和" LinkedHashSet"。

2 个答案:

答案 0 :(得分:2)

使用trait(接口)Seq(有序列表),Map(键值),Set,IndexedSeq,Array(用于Java原语)类型,让编译器选择实现。如果查看源代码,您将看到每个源的伴随对象。这使用工厂为您找到实现。

这页帮助了我。 http://docs.scala-lang.org/overviews/collections/overview.html

有关具体集合的部分将进入实现。

Seq伴侣对象:

object Seq extends SeqFactory[Seq] {
  /** $genericCanBuildFromInfo */
  implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Seq[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]

  def newBuilder[A]: Builder[A, Seq[A]] = immutable.Seq.newBuilder[A]
}

https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/Seq.scala#L1

查看工厂源代码,了解apply如何初始化集合。

abstract class GenericCompanion[+CC[X] <: GenTraversable[X]] {
  /** The underlying collection type with unknown element type */
  type Coll = CC[_]

  /** The default builder for `$Coll` objects.
   *  @tparam A      the type of the ${coll}'s elements
   */
  def newBuilder[A]: Builder[A, CC[A]]

  /** An empty collection of type `$Coll[A]`
   *  @tparam A      the type of the ${coll}'s elements
   */
  def empty[A]: CC[A] = newBuilder[A].result

  /** Creates a $coll with the specified elements.
   *  @tparam A      the type of the ${coll}'s elements
   *  @param elems  the elements of the created $coll
   *  @return a new $coll with elements `elems`
   */
  def apply[A](elems: A*): CC[A] = {
    if (elems.isEmpty) empty[A]
    else {
      val b = newBuilder[A]
      b ++= elems
      b.result
    }
  }
}

https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/generic/GenericCompanion.scala#L1

更新: 我通常使用Array作为可变索引集合类型,因为它更容易键入,但Vector不可变。 Scala样式鼓励使用不可变集合,因为创建不可变数据结构的新“副本”是高性能的,因为底层实现是使用Hash数组映射的trie结构完成的。 http://en.wikipedia.org/wiki/Hash_array_mapped_trie

答案 1 :(得分:0)

  

我已经在Scala编程了几个月了。我还在   被许多不同的收藏所困惑。

你可能只需要一些时间来适应一些事情。 Scala不会是Scala,如果它看起来完全像另一种语言,对吧? :)每种编程语言都有其优点和缺点。

  

是否有某个页面/文章显示每种类型最佳的内容   适合?

您实际上需要一篇关于数据结构的一般文章。例如。如果您需要将数据存储在集合中,并且需要快速访问它们而不需要修改集合,那么数组是合适的。数组,列表,集合,映射等是在每种语言中基本上表现相同的数据结构。差异在于语法。

  

Scala的问题在于它有太多不同的类型   你有像Array一样直接映射到Java数组,   然后你会有类似的东西#34; Set&#34;这实际上是一个&#34;特质&#34;但是你   即使我的理解是a,也可以像普通课一样使用它   特质就像一个界面。文档说&#34;实现一个   具体集,您需要定义以下方法:...&#34;但   实际上我可以使用它。

您应该查看@sam已发布的链接:http://docs.scala-lang.org/overviews/collections/overview.html以下是另一个:http://twitter.github.io/scala_school/collections.html