Scala 可变数组 ArrayBuffer 操作

61 阅读3分钟

在 Scala 编程中,数组是处理有序数据的基础结构。Scala 提供了两种核心数组类型:不可变的 Array和可变的 ArrayBuffer。本文将聚焦 ArrayBuffer 的核心特性与常用操作,帮助开发者掌握可变数组的使用方法。

一、ArrayBuffer 基础认知

ArrayBuffer 属于 scala.collection.mutable 包下的可变序列,其核心优势是动态调整长度,适合需要频繁增删元素的场景。与之对比,原生 Array 一旦创建,长度不可变更,仅能修改指定下标对应的元素值。

使用前需确保导入对应包:

import scala.collection.mutable.ArrayBuffer

二、ArrayBuffer 核心操作

1. 创建 ArrayBuffer

创建可变数组的最常用方式是直接初始化元素,Scala 会自动推导元素类型:

// 创建包含初始元素 1,2,3 的 Int 类型 ArrayBuffer
val arr = ArrayBuffer(1, 2, 3)
println("初始数组:" + arr) // 输出:ArrayBuffer(1, 2, 3)

2. 元素添加

ArrayBuffer 提供了灵活的添加方式,核心运算符为 +=和 ++=

// 1. 追加单个元素
arr += 4 
// 2. 追加多个元素
arr += (5, 6) 
println("追加4、5、6后:" + arr) // 输出:ArrayBuffer(1, 2, 3, 4, 5, 6)

// 3. 批量追加其他集合(数组/ArrayBuffer 均可)
arr ++= Array(7, 8) // 追加不可变 Array
arr ++= ArrayBuffer(9, 10) // 追加另一个 ArrayBuffer
println("批量追加后:" + arr) // 输出:ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

3. 元素删除

删除操作核心运算符为 -=和 --=,注意删除的是第一个匹配的元素值,而非下标:

// 1. 删除单个元素
arr -= 2 
// 2. 批量删除多个元素
arr --= (5, 7) 
println("删除2、5、7后:" + arr) // 输出:ArrayBuffer(1, 3, 4, 6, 8, 9, 10)

4. 元素获取与修改

ArrayBuffer 支持通过下标直接访问和修改元素,下标从 0 开始:

// 1. 获取指定下标元素(获取第一个元素,下标 0)
val firstEle = arr(0)
println("下标0的元素:" + firstEle) // 输出:1

// 2. 修改指定下标元素(将下标0的元素改为 100)
arr(0) = 100
println("修改下标0后:" + arr) // 输出:ArrayBuffer(100, 3, 4, 6, 8, 9, 10)

5. 数组遍历

遍历 ArrayBuffer 有两种常用方式:foreach 高阶函数和传统 for 循环:

// 方式1:foreach 遍历(推荐,函数式风格)
println("foreach 遍历结果:")
arr.foreach(ele => println(ele)) 
// 简化写法(单个参数时,可省略括号和 =>)
// arr.foreach(println)

// 方式2:for 循环遍历
println("for 循环遍历结果:")
for (i <- 0 until arr.length) {
  println(s"下标 $i 的元素:${arr(i)}")
}

三、Array 与 ArrayBuffer 核心区别

特性Array(不可变)ArrayBuffer(可变)
长度特性创建后长度固定长度动态增删
核心操作仅支持元素修改支持增、删、改、查
内存效率无需额外内存维护长度扩容时会预留内存,略有开销
使用场景数据长度固定、只读操作多数据频繁增删、长度动态变化

四、总结

ArrayBuffer 是 Scala 处理可变长度数组的核心工具,其 +=/-=/++=/--= 运算符提供了简洁的增删语法,下标访问和遍历方式与不可变 Array 保持一致,降低了学习成本。在实际开发中,若数据长度固定,优先使用不可变 Array 保证线程安全;若需频繁增删元素,则选择 ArrayBuffer 提升开发效率。