Answers:
用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
,而后者是导入到范围中的“默认”。
还有GenSeq
和ParSeq
。后面的方法在平行尽可能运行,而前者是父既Seq
和ParSeq
,是用于当的代码并行无所谓合适的概括。它们都是相对较新的引入,因此人们还不太使用它们。
UnsupportedOperationException
。要在Java中创建不可变列表,请使用Collections.unmodifiableList(),类似地,还有Set,Maps等其他方法。docs.oracle.com
甲SEQ是一个可迭代具有定义的元素的顺序。序列提供了一种apply()
索引方法,范围从0到序列的长度。Seq有许多子类,包括Queue,Range,List,Stack和LinkedList。
一个列表是作为不可改变的链表实现的序列。最好使用后进先出(LIFO)访问模式的情况。
这是Scala FAQ中完整的集合类层次结构:
Seq
是List
实现的特征。
如果将容器定义为Seq
,则可以使用任何实现Seq
trait的容器。
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
注意
scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
只是:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
如果未指定容器类型,则基础数据结构默认为List
。
正如@ daniel-c-sobral所说,List扩展了特征Seq并是由scala.collection.immutable.$colon$colon
(或::
简称)实现的抽象类,但是除了技术方面,请记住,我们使用的大多数列表和seq都以Seq(1, 2, 3)
或List(1, 2, 3)
返回的形式初始化。scala.collection.immutable.$colon$colon
,因此可以这样写:
var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
结果,我认为最重要的不是您要公开的方法,例如,您可以::
在List中使用,而我发现+:
Seq 多余,我个人默认使用Seq。
String
它不是集合,但它是Java程序员熟悉的不可变类的示例。