scala教程:不可变数组

介绍

scala 中的数组分两种:不可变数组 和 可变数组,这里只介绍 不可变数组,使用起来与java中的数组类似

在scala、大数据开发中,更推荐使用 不可变数组

特点

不可变数组可以 添加元素,添加后,返回一个 新数组,新数组有该新添加的元素,原数组不会改变,类似 Java中的 String 对象

应用场景

入口函数 main() 函数的形参就是 不可变数组

def main(args: Array[String]): Unit = {

}

定义语法

方式一

val arr=new Array(10)

或者

val arr=new Array[Int](10)

或者

val arr : Array[Int] = new Array[Int](10)

或者

var arr2 : Array[Int] = new Array[Int](10)

解释:

  • new:是关键字

  • [Int]:相当于java中的泛型,可以存放的 Int类型,当前数组中的初始值是0
    如果希望存放任意数据类型,则指定 Any

  • (10):表示数组的大小,确定后就不能改变

含义:
创建一个数组,长度是 10,初始值是10个0,只能存放 Int类型的数据

方式二

通过 伴生对象 创建数组

val arr=Array[Int](1,2,3)

或者

var arr4:Array[Int] = Array[Int](1,2,3)

或者

val arr5:Array[Int] = Array[Int](1,2,3)

解释:

  • Array:伴生对象,全写是:val arr2=Array.apply[Int](1,2,3)

  • [Int]:相当于java中的泛型,可以存放的数据类型,如果希望存放任意数据类型,则指定 Any

  • (1,2,3):数组中的元素,定义数组时直接赋初始值

将数组转成字符串 mkString()

使用 mkString() 方法,可以将 数组中的元素拼接成一个字符串,并可指定元素的 分隔符

val arr = new Array[Int](10)
println(arr.mkString(","))

执行结果:

0,0,0,0,0,0,0,0,0,0

索引

相当于 编号 ,数组中的每一个元素,都会有一个编号,从0开始

注意: 索引从0开始

访问数组中的元素

通过索引访问,索引从 0 开始,也就是说索引是0,表示数组中的第1个元素

语法

数组名(索引)

注意: 与C、JAVA不同,scala用的是小括号 (),底层实现是 Array 类的 apply() 方法

例子

println(arr(0))

数组越界

如果当前数组只有5个元素,但访问第6个元素,就会报错,错误是 数组越界

即:访问不存在的元素,就会报 数组越界,如下

java.lang.ArrayIndexOutOfBoundsException: 6

修改数组中的值

通过索引修改

语法

数组名(索引) = 值

例子

arr(0) = 7

数组的长度属性

通过 数组名.length 获取数组的长度,Int类型

def main(args: Array[String]): Unit = {

  val arr=new Array[Int](10)
  println(arr.length)

  val arr2=Array[Int](1,2,3)
  println(arr2.length)

}

本质

length 不是属性,而是方法,scala中,也可以定义没有 () 的方法,底层代码如下:

def length: Int = throw new Error()

在尾部添加元素 语法一

:+ 表示在头部添加,: 在前,+ 在后

val 新数组名 = 数组名.:+(元素)

例子

def main(args: Array[String]): Unit = {
  val arr=Array[Int](1,2,300)

  //添加元素,返回一个数组
  val arr2=arr.:+(404)

  println(arr.mkString(",")) // 原数组没有变化
  println(arr2.mkString(",")) // 新数组有新添加的元素
}

:+的本质

:+ 的本质是方法,声明如下:

def :+[B >: T: ClassTag](elem: B): Array[B]

在尾部添加元素 语法二

语法一的省略写法:

val 新数组名 = 数组名 :+ 元素

解释:

语法一的省略写法,因为 在scala中,调用对象的方法可以省略 .,如下:

val 新数组名 = 数组名:+(元素)

如果参数 只有一个,那么 () 也可以省略

例子

def main(args: Array[String]): Unit = {
  val arr=Array[Int](1,2,300)

  //添加元素,返回一个数组
  val arr2=arr :+ 404 :+ 405

  println("原数组:"+arr.mkString(",")) // 原数组没有变化
  println("新数组:"+arr2.mkString(",")) // 新数组有新添加的元素
}

在头部添加元素

+: 表示在头部添加,+ 在前,: 在后

语法一

val 新数组名 = 数组名.+:(元素)
例子
def main(args: Array[String]): Unit = {
  val arr=Array[Int](1,2,300)

  //添加元素,返回一个数组
  val arr2=arr.+:(404)

  println("原数组:"+arr.mkString(",")) // 原数组没有变化
  println("新数组:"+arr2.mkString(",")) // 新数组有新添加的元素
}

执行结果:

原数组:1,2,300
新数组:404,1,2,300

语法二(特殊)

注意: 添加的元素 在前,数组名 在后。顺序不能颠倒,否则报错

val 新数组名 = 元素 +: 数组名

可以实现连加:

val 新数组名 = 元素1 +: 元素2 +: 数组名
例子
def main(args: Array[String]): Unit = {
  val arr=Array[Int](1,2,300)

  //添加元素,返回一个数组
  val arr2=404 +: 405 +: arr

  println("原数组:"+arr.mkString(",")) // 原数组没有变化
  println("新数组:"+arr2.mkString(",")) // 新数组有新添加的元素
}

原文出处:/show_1IX1BYJtNM8s.html