你如何选择一个通用的可变序列在你的Scala应用中。
es6
正像Vector被推荐做为不可变序列容器的指定类,ArrayBuffer则被推荐做为通用的可变序列容器指定类。(ArrayBuffer是带索引的序列容器,若是你想使用链式序列容器,能够使用ListBuffer)app
在使用ArrayBuffer以前你必须先引入它:
dom
scala> import scala.collection.mutable.ArrayBuffer import scala.collection.mutable.ArrayBuffer
接下来你就能够建立一个空的ArrayBuffer:性能
scala> var fruits = ArrayBuffer[String]() fruits: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer() scala> var ints = ArrayBuffer[Int]() ints: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
或者,你也能够建立带有初始化数据的ArrayBuffer:ui
scala> var numbers = ArrayBuffer(1,2,3) numbers: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)
与其它可变容器同样,你能够使用+=,++=来给容器添加元素:es5
scala> var numbers = ArrayBuffer(1,2,3) numbers: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3) scala> numbers += 4 res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4) scala> numbers ++= Array(5,6) res4: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6)
你还能够使用-+,--+方法来删除容器中的元素:spa
scala> numbers ++= Array(5,6) res4: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6) scala> numbers -= 6 res5: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5) scala> numbers --= Array(3,4,5) res6: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2)
除了+=,++=,-=,--=以外,ArrayBuffer还有不少其它方法用来添加或者删除元素,它们是:scala
scala> val a = ArrayBuffer(1, 2, 3) // ArrayBuffer(1, 2, 3) a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3) scala> a.append(4) // ArrayBuffer(1, 2, 3, 4) scala> a.append(5, 6) // ArrayBuffer(1, 2, 3, 4, 5, 6) scala> a.appendAll(Seq(7,8)) // ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8) scala> a.clear // ArrayBuffer() scala> val a = ArrayBuffer(9, 10) // ArrayBuffer(9, 10) a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(9, 10) scala> a.insert(0, 8) // ArrayBuffer(8, 9, 10) scala> a.insert(0, 6, 7) // ArrayBuffer(6, 7, 8, 9, 10) scala> a.insertAll(0, Vector(4, 5)) // ArrayBuffer(4, 5, 6, 7, 8, 9, 10) scala> a.prepend(3) // ArrayBuffer(3, 4, 5, 6, 7, 8, 9, 10) scala> a.prepend(1, 2) // ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> a.prependAll(Array(0)) // ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val a = ArrayBuffer.range('a', 'h') // ArrayBuffer(a, b, c, d, e, f, g) a: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(a, b, c, d, e, f, g) scala> a.remove(0) // ArrayBuffer(b, c, d, e, f, g) res17: Char = a scala> a.remove(2, 3) // ArrayBuffer(b, c, g) scala> val a = ArrayBuffer.range('a', 'h') // ArrayBuffer(a, b, c, d, e, f, g) a: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(a, b, c, d, e, f, g) scala> a.trimStart(2) // ArrayBuffer(c, d, e, f, g) scala> a.trimEnd(2) // ArrayBuffer(c, d, e)
ArrayBuffer的Scala文档提供了对于ArrayBuffer性能方面更详细的说明:“Append,update,random access消耗常量时间。PrePends和removes和buffer的大小是线性相关的。“同时ArrayBuffer文档也提到,“ArrayBuffer一般用来高效低构造一个大型的容器,当新元素老是添加到最后的时候。”code
若是你须要一个可变序列容器能够像使用List同样,那么应该用ListBuffer。“ListBuffer就像ArrayBuffer同样,除了它内部实现是一个链表。若是你准备在创建完容器之后,把当前容器转化为一个List,使用ListBuffer是一个更好的选择。“索引