介绍
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(",")) // 新数组有新添加的元素
}