Nil 其实就是一个空的不可变的 List

scala> Nil
res16: scala.collection.immutable.Nil.type = List()

ScalaListArray 非常相似,列表的所有元素都具有相同的类型,

但有两个重要的区别:

  • 首先,列表是不可变的,列表的元素不能通过赋值来更改
  • 其次,列表 具有递归的结构(也就是链接表结构)而数组不是

具有类型 T 的元素的列表的类型被写为 List[T]


一、定长的List

对 List 进行操作,会产生一个新的 List,原来的 List 并没有改变

(1)定义

scala> val l = List(1,2,3,4,5)
l: List[Int] = List(1, 2, 3, 4, 5)

一个 Listheadtail 组合成的
第一个元素就是 head,其余都是 tail

scala> l.head
res17: Int = 1

scala> l.tail
res18: List[Int] = List(2, 3, 4, 5)

(2)使用 :: 连接,语法:head :: tail

scala> val l2 = 1 :: Nil  // 把 1 当作 head,把Nil 当作tail,把它们拼成一个新的List
l2: List[Int] = List(1)

scala> val l3 = 2 :: l2
l3: List[Int] = List(2, 1)

scala> val l4 = 1 :: 2 :: 3 :: Nil
l4: List[Int] = List(1, 2, 3)

(3)使用 List.concat() 连接

scala> la
res89: List[Int] = List(1, 2, 3)

scala> lb
res90: List[Int] = List(4, 5, 6)

scala> List.concat(la, lb)
res91: List[Int] = List(1, 2, 3, 4, 5, 6)

(4)查看长度

scala> l.length
res19: Int = 5    // 长度为5,所以他也是定长的

(5)翻转

scala> la
res93: List[Int] = List(1, 2, 3)

scala> la.reverse
res94: List[Int] = List(3, 2, 1)

(6)tabulate

List.tabulate() 方法是通过给定的函数来创建列表。

  • 第一个参数为元素的数量,可以是二维的
  • 第二个参数为指定的函数,我们通过指定的函数计算结果,并返回值插入到列表中,起始值为 0
// 通过给定的函数创建 4 个元素
val la = List.tabulate(4)(n => n * n)
println("la : " + la)

// 创建二维列表
val lb = List.tabulate(3, 4)(_ * _)
println("lb : " + lb)

输出

la : List(0, 1, 4, 9)
lb : List(List(0, 0, 0, 0), List(0, 1, 2, 3), List(0, 2, 4, 6))

二、变长的 ListBuffer

ListBuffer 进行操作,就是对原来的 ListBuffer 进行操作,不会新生成 ListBuffer

scala> val l5 = scala.collection.mutable.ListBuffer[Int]()
l5: scala.collection.mutable.ListBuffer[Int] = ListBuffer()

(1)追加

ListBuffer 支持尾部追加

scala> l5 += 2
res24: l5.type = ListBuffer(2)

scala> println(l5)
ListBuffer(2)

scala> l5 += (3,4,5)
res26: l5.type = ListBuffer(2, 3, 4, 5)

scala> l5 ++= List(6,7,8,9)
res27: l5.type = ListBuffer(2, 3, 4, 5, 6, 7, 8, 9)

(2)删除

指定元素删除

scala> l5 -= 2
res29: l5.type = ListBuffer(3, 4, 5, 6, 7, 8, 9)

scala> l5 -= (1,4)
res30: l5.type = ListBuffer(3, 5, 6, 7, 8, 9)

scala> l5 --= List(3,5,6)
res32: l5.type = ListBuffer(7, 8, 9)

三、类型转换

scala> l5 += (4,5,6,7)
res40: l5.type = ListBuffer(4, 5, 6, 7)

scala> l5.toList
res41: List[Int] = List(4, 5, 6, 7)

scala> l5.toArray
res42: Array[Int] = Array(4, 5, 6, 7)

四、三个基本操作

  • head 返回列表第一个元素
  • tail 返回一个列表,包含除了第一元素之外的其他元素:(是一个列表或者Nil)
  • isEmpty 在列表为空时返回true
scala> l5.isEmpty
res45: Boolean = false

scala> l5.tail
res46: scala.collection.mutable.ListBuffer[Int] = ListBuffer(5, 6, 7)

scala> l5.tail.head
res47: Int = 5

五、一个求和的例子

  def sum(nums: Int*): Int = {
    if (nums.length == 0){
      0
    }else{
      // 这是一个递归
      nums.head + sum(nums.tail:_*) // :_* 可以把seq转成可变参数
    }

  }

  println(sum())
  println(sum(1,2,3,4))

输出

0
10