在Scala中,List是一种有序、不可变的链表结构,是函数式编程中常用的集合类型,默认情况下所有List均为不可变(即创建后元素和结构无法修改,修改操作会返回新的List);若需动态增删元素,需使用可变版本ListBuffer(需导入scala.collection.mutable.ListBuffer)。
List的核心特性包括:
- 有序性:元素按添加顺序存储,支持下标访问(通过
apply(index)方法) - ; 2. 不可变性:默认List的增删操作(如
appended、prepended)不会修改原列表,而是生成新列表; -
- 链表实现:元素存储在节点中,头部操作(如
prepended)效率高,尾部操作效率较低(需遍历整个链表)。 常用操作分为不可变List与可变ListBuffer两类: - 不可变List:通过appended(尾部添加)、prepended(头部添加)、++/:::(合并列表)实现元素操作; - 可变ListBuffer:支持+=(尾部添加)、prepend(头部添加)、insert(指定位置添加)、-=/remove(删除元素)等直接修改原列表的操作。 遍历List可通过for循环或foreach方法实现,元素查询则使用contains方法。List是Scala集合体系的基础类型,适用于数据不频繁修改、需要函数式操作(如映射、过滤)的场景,而可变ListBuffer更适合频繁增删元素的场景。
- 链表实现:元素存储在节点中,头部操作(如
一、List 的定义与核心特性
1. 概念
List 是 Scala 中有序的数据结构,底层采用链表结构,分为不可变 List(默认)和可变 List(ListBuffer 实现)两类,核心区别在于是否支持元素 / 结构修改。
2. 定义格式与示例
(1)不可变 List
- 特点:创建后元素和结构不可修改,修改操作会返回新列表
- 定义格式:
val 列表名称: List[元素类型] = List(element1, element2, ...) - 示例:
// 创建存储中国名山的不可变
List val famousMountains: List[String] = List("泰山", "衡山", "华山", "恒山", "嵩山")
(2)可变 List(ListBuffer)
- 特点:支持动态修改元素(添加、删除),无需创建新列表
- 依赖导入:
import scala.collection.mutable.ListBuffer - 定义格式:
val 列表名称 = ListBuffer[元素类型](element1, element2, ...) - 示例:
import scala.collection.mutable.ListBuffer
// 创建存储名山的可变
List val mutableFamousMountainsBuffer = ListBuffer[String]("黄山")
二、可变 List(ListBuffer)常用方法
1. 添加元素
| 方法 / 操作符 | 功能描述 | 格式示例 |
|---|---|---|
+= | 向列表尾部添加单个元素 | listBuffer += 元素 |
append | 向列表尾部添加单个元素(与 += 功能一致) | listBuffer.append(元素) |
prepend | 向列表头部添加单个元素 | listBuffer.prepend(元素) |
insert | 向指定索引位置添加元素(原位置元素后移) | listBuffer.insert(索引, 元素) |
val l1 = ListBuffer[Int](1, 2, 3)
l1 += 4 // 尾部添加,结果:ListBuffer(1, 2, 3, 4)
l1.append(5) // 尾部添加,结果:ListBuffer(1, 2, 3, 4, 5)
l1.prepend(-1) // 头部添加,结果:ListBuffer(-1, 1, 2, 3, 4, 5)
l1.insert(2, 150) // 索引2位置添加,结果:ListBuffer(-1, 1, 150, 2, 3, 4, 5)
2. 删除元素
| 方法 / 操作符 | 功能描述 | 格式示例 |
|---|---|---|
-= | 删除列表中第一个匹配的指定元素 | listBuffer -= 元素 |
remove | 删除指定索引位置的元素 | listBuffer.remove(索引) |
代码演示:
val l1 = ListBuffer[Int](-1, 1, 150, 2, 3)
l1 -= 150 // 删除元素150,结果:ListBuffer(-1, 1, 2, 3)
l1.remove(0) // 删除索引0的元素,结果:ListBuffer(1, 2, 3)
3. 元素存在性查询
- 方法:
contains - 功能:判断列表是否包含指定元素,返回布尔值(
true存在,false不存在) - 格式:
val 结果: Boolean = listBuffer.contains(元素)代码演示
val containsTaiShan: Boolean = famousMountains.contains("泰山")
println(containsTaiShan) // 输出:true(因"泰山"在不可变列表中)
4. 列表合并
- 方法:
++ - 功能:合并两个 ListBuffer,返回新的 ListBuffer(原列表不变)
- 格式:
val 新列表 = 列表1 ++ 列表2代码演示:
val l2 = ListBuffer(10, 20)
val l3 = l1 ++ l2 // 合并l1和l2,结果:ListBuffer(1, 2, 3, 10, 20)
5. 列表遍历
(1)for 循环遍历
格式
for (元素变量 <- 列表名称) { // 元素操作(如打印、计算等) }
代码演示:
列表名称.foreach { 元素变量 => // 元素操作 }
代码演示:
famousMountains.foreach { mountain => println(mountain) // 与for循环效果一致,依次打印名山 }
三、不可变 List 常用方法
1. 添加元素
-
特点:不可变 List 本身不能修改,添加操作会返回新的不可变 List
-
常用方法:
方法 功能描述 格式示例 appended向尾部添加元素,返回新列表 val 新列表 = 原列表.appended(元素)prepended向头部添加元素,返回新列表 val 新列表 = 原列表.prepended(元素) -
代码演示:
val l1 = List(1, 2, 3)
val l2 = l1.appended(4) // 尾部添加,原l1不变,l2结果:List(1, 2, 3, 4)
val l3 = l1.prepended(-1) // 头部添加,原l1不变,l3结果:List(-1, 1, 2, 3)
2. 列表合并
- 方法:
++或:::(两者功能完全一致) - 功能:合并两个不可变 List,返回新的不可变 List(原列表不变)
- 格式:
val 新列表 = 列表1 ++ 列表2或val 新列表 = 列表1 ::: 列表2 - 代码演示:
val l1 = List(1, 2, 3)
val l2 = List(10, 20)
val l3 = l1 ++ l2 // 合并结果:List(1, 2, 3, 10, 20)
val l4 = l1 ::: l2 // 合并结果:List(1, 2, 3, 10, 20)