Scala中Seq和List之间的区别

ope*_*sas 279 collections scala list seq

我在很多例子中看到有时使用Seq,而其他时候是List ......

除了前一个是Scala类型和List来自Java之外,有什么区别吗?

Dan*_*ral 378

用Java术语来说,Scala Seq是Java List,而Scala List是Java LinkedList.

请注意,这Seq是一个trait等同于Java的interface,但具有相当于崭露头角的防御方法.Scala的List是受扩展的抽象类Nil::,它们是的具体实现List.

所以,在Java List是的地方interface,Scala List是一个实现.

除此之外,Scala List是不可改变的,事实并非如此LinkedList.事实上,Java没有相当于不可变的集合(只读的东西只保证新对象不能改变,但你仍然可以改变旧的,因此,"只读"一个).

Scala List是由编译器和库高度优化的,它是函数式编程中的基本数据类型.但是,它有局限性,并不适合并行编程.这些天,Vector是比较好的选择List,但习惯很难打破.

Seq对序列是一个很好的推广,所以如果编程到接口,你应该使用它.请注意,实际上他们三个分别是:collection.Seq,collection.mutable.Seq而且collection.immutable.Seq,它是后者的一个是"默认"导入范围.

还有GenSeqParSeq.后一种方法尽可能并行运行,而前者是两者的父对象,Seq并且ParSeq当代码的并行性无关紧要时,它是一种合适的推广.它们都是相对较新引入的,所以人们还没有使用它们.

  • @jbx不对.如果使用这些方法,则会得到一个对象,它会在修改它的方法上抛出异常,而不是_immutable_对象.如果在创建不可修改的对象之后修改了原始对象,则不可修改的对象将反映出该对象.所以,不可修改,是的,不可改变的,不. (23认同)
  • @huynhjl那就是重点.我在Java中存在的内容与Scala中存在的内容之间进行了相似的描述,并且Java中没有任何可变/不可变集合的概念. (13认同)
  • RE*"Java不等同于不可变集合"*,虽然`String`不是集合,但它是Java程序员熟悉的不可变类的示例. (3认同)
  • Java实际上具有相当于不可变的集合.它不是那个"广告宣传"但它在那里,当你大量使用泛型时,你可能会因此而遇到一些`UnsupportedOperationException`.要在Java中创建不可变列表,请使用Collections.unmodifiableList(),类似地,还有其他方法可用于集合,映射等.http://docs.oracle.com/javase/6/docs/api/java/util/Collections html的#unmodifiableList(java.util.List中) (2认同)
  • @jbx接收方法不能保持对它收到的集合的引用,并假设它永远不会改变,并且标准Java库中没有类型可以保证 - 这是不变的.因此,例如,接收方法不能保证线程安全.而这甚至没有触及不变性所带来的持久特征.没有这一切,它不能被称为"等效". (2认同)
  • @ChrisPrince因为`Seq`既是特征又是对象。当您编写“ var x = Seq(1、2、3)”时,您正在对对象调用“ apply”方法。 (2认同)

Cea*_*sta 74

SEQ是一个可迭代具有定义的元素的顺序.序列提供了一种apply()索引方法,范围从0到序列的长度.Seq有许多子类,包括Queue,Range,List,Stack和LinkedList.

一个列表是作为不可改变的链表实现的序列.它最适用于具有后进先出(LIFO)访问模式的情况.

以下是Scala FAQ中的完整集合类层次结构:

在此输入图像描述

  • Array(和ArrayBuffer)在哪里?它不是一种可迭代的 (5认同)

Aka*_*all 20

Seq是一种List实现的特征.

如果将容器定义为Seq,则可以使用任何实现Seq特征的容器.

scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int

scala> sumUp(List(1,2,3))
res41: Int = 6

scala> sumUp(Vector(1,2,3))
res42: Int = 6

scala> sumUp(Seq(1,2,3))
res44: Int = 6
Run Code Online (Sandbox Code Playgroud)

注意

scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

只是一个简短的手:

scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

如果未指定容器类型,则基础数据结构默认为List.


zak*_*ssi 18

在Scala中,List继承自Seq,但实现了Product ; 这是List的正确定义:

sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
Run Code Online (Sandbox Code Playgroud)

[注意:为了适应并利用Scala非常强大的集合框架,实际定义有点复杂.]