List

6 阅读2分钟
object List01 {
  def main(args: Array[String]): Unit = {
    // 1. 不可变List - 默认的Scala List是不可变的
    val list1 = List("湖北省", "浙江省")
    println("不可变List: " + list1)
    
    // 尝试修改会出错(编译通过但运行时会创建新List)
    val list1Updated = list1 :+ "北京市"  // 这不会修改原list,而是创建新list
    println("原List不变: " + list1)
    println("新的List: " + list1Updated)
    
    // 2. 可变ListBuffer - 需要显式导入mutable包
    val list2 = scala.collection.mutable.ListBuffer("湖北省", "浙江省")
    list2 += "北京市"  // 直接修改原ListBuffer
    println("可变ListBuffer: " + list2)
    
    // 更多ListBuffer操作示例
    list2.append("上海市")  // 添加到尾部
    println("添加上海市后: " + list2)
    
    list2.prepend("广东省")  // 添加到头部
    println("添加到头部后: " + list2)
    
    list2.insert(2, "江苏省")  // 插入到指定位置
    println("插入江苏省到第3个位置后: " + list2)
    
    // 删除元素
    list2 -= "浙江省"  // 删除指定元素
    println("删除浙江省后: " + list2)
    
    list2.remove(0)  // 删除指定索引位置的元素
    println("删除第一个元素后: " + list2)
    
    // 不可变List的常用操作
    println("\n不可变List的操作:")
    val provinces = List("湖北", "浙江", "北京", "上海")
    
    // 头部和尾部
    println("第一个元素: " + provinces.head)
    println("除第一个外的其他元素: " + provinces.tail)
    println("最后一个元素: " + provinces.last)
    println("除最后一个外的其他元素: " + provinces.init)
    
    // List连接
    val moreProvinces = List("广东", "江苏")
    val allProvinces = provinces ::: moreProvinces
    println("连接两个List: " + allProvinces)
    
    // 遍历
    println("遍历List:")
    provinces.foreach(println)
    
    // map操作
    val provinceLengths = provinces.map(_.length)
    println("各省名称长度: " + provinceLengths)
  }
}

主要区别:

不可变List (scala.collection.immutable.List)

  • 默认导入,可以直接使用 List
  • 不可修改:所有修改操作都会返回一个新的List
  • 线程安全:因为不可变
  • 常用操作::::::++:

可变ListBuffer (scala.collection.mutable.ListBuffer)

  • 需要显式导入import scala.collection.mutable.ListBuffer
  • 可以修改:支持原地修改操作
  • 性能优势:频繁修改时效率更高
  • 常用操作+=-=appendprependinsertremove

使用建议:

  • 优先使用不可变List:函数式编程的最佳实践
  • 仅在需要频繁修改时使用ListBuffer:如构建大列表
  • ListBuffer可以转换为ListlistBuffer.toList