3 回答
TA贡献1963条经验 获得超6个赞
Scala中的List是不可变的递归数据(immutable recursive data),是Scala中的一种基础结构,你应该多用List而不是Array(Array实际上是mutable,不可变(immutable)的Array是IndexedSeq)
Mutable Structures
ListBuffer提供一个常数时间的转换到List。
一个Scala的Array应该是由Java array生成的,因此一个Array[Int]也许比List[Int]更有效率。
但是,我认为Scala中数组尽量少用,因为它感觉是你真的需要知道底层发生了什么,来决定是否Array将所需的基本数据类型进行备份,或者可能boxed as a wrapper type.
TA贡献1829条经验 获得超7个赞
Arrays are mutable, indexed collections of values. Array[T] is Scala's representation for Java's T[].
Array:
可变
用下标访问,利于随机访问
是Java数组的一种表示
List is a class for immutable linked lists representing ordered collections
of elements of type A.This class comes with two implementing case classes scala.Nil and scala.:: that implement the abstract members isEmpty, head and tail.This class is optimal for last-in-first-out (LIFO), stack-like access patterns. If you need another access
pattern, for example, random access or FIFO, consider using a collection more suited to this than List.
List:
不可变
为后进先出做了优化,像栈一样的访问模式
支持用::在模式匹配中取出head和tail
TA贡献1830条经验 获得超9个赞
Scala的Seq将是Java的List,Scala的List将是Java的LinkedList。
请注意,Seq是一个trait,它相当于Java的接口,但相当于即将到来的防御者方法。 Scala的List是一个抽象类,由Nil和::扩展,这是List的具体实现。
所以,在Java的List是一个接口,Scala的List是一个实现。
除此之外,Scala的List是不可变的,这不是LinkedList的情况。事实上,Java没有等价的不可变集合(只读的东西只保证新的对象不能改变,但你仍然可以改变旧的,因此,“只读”一个)。
Scala的List是由编译器和库高度优化的,它是函数式编程中的基本数据类型。然而,它有限制,它不足以并行编程。这些天,Vector是一个比List更好的选择,但习惯是很难打破。
Seq是一个很好的泛化序列,所以如果你编程到接口,你应该使用它。注意,实际上有三个:collection.Seq,collection.mutable.Seq和collection.immutable.Seq,它是后一个是“默认”导入到范围。
还有GenSeq和ParSeq。后面的方法在可能的情况下并行运行,前者是Seq和ParSeq的父代,这是当代码的并行性无关紧要的合适的泛化。它们都是相对新引入的,因此人们不会使用它们。
- 3 回答
- 0 关注
- 5237 浏览
添加回答
举报