开发者学堂课程【Scala 核心编程 - 进阶:ArrayBuffer 的基本使用】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9025
ArrayBuffer 的基本使用
内容简介:
一、数组-定长数组(声明泛型)
二、数组-变长数组(声明泛型)
三、变长数组分析小结
一、数组-定长数组(声明泛型)
第二种方式定义数组在定义数组时,直接赋值
//使用 apply 方法创建数组对象
val arr1 = Array(1,2)
var arr02 =Array(1,3.“xxx""
For (i<-arr02)(
Printin(i)
)
二、数组-变长数组(声明泛型)
1.声明
变长数组的名字叫 Arraybuffer,后面需要指定一个范型,因为是变长的输出,所以不停的往里面添加就可以,Append 就是追加。
学习集合的流程包括如何创建、如何查询,如何修改和如何删除。在学习定长数组的时候没有讲删除,是因为定长数组没有办法直接进行删除。
val arr2 = ArrayBuffer[Int]()
//追加值/元素
arr2.append(7)
//重新赋值
arr2(0)= 7
学习集合的流程(创建,查询,修改,删除)
案例演示+反编译
如果想要放任何数据就写 any,小括号后面可以代指也可以不代指,Append 就会直接让 arr2进行改变,arr2本身就会发生变化,重新赋值就是访问某个元素。
2.代码演示
Name为ArreyBufferDemo01,Kind 定义为 Object,第一步,首先要引一个包,不引array的原因,Array 是一个集合,是集合就只能够在 scala.collection.mutable和 scala.collection.immutable.Arr 两个包里面。
Arrey 没有用的原因,进入到 Array,下拉找到 package scala,不需要再额外引一个包了。但是到了 ArrayBuffer 就不同了,因为 ArrayBuffer不在这个包,看一下ArrayBuffer 在哪个包里面,就输入以下代码
import scala.collection. mutable .ArrayBuffer(ArrayBuffer 是可变的,如果以后找可变的就按照这个程序)
光标定位在 mutable,按下 ctrl+B 直接可以看到可变的包含哪些东西。体系里面只写了一部分,不推荐使用的会有一条横线。
不可变的是在 immutable 里面,不可变的体系是没有可变多的。
object ArrayBufferDemoo1 {
def main(args: Array[string]): unit = {
//创建ArrayBuffer
val arro1 =ArrayBuffer[Any](3,2,5)
Any 代表在这个 Arraybuffer 里面什么都可以放,初始化设置3,2,5
//通过下标访问元素
prntin("arrQ1(1)=" +arr01(1))//arr01(1)=2
//遍历(遍历是有序的,hashcode是随机的)
for (i <-arro1){
println(i)
}
println(arr01.length) //长度为3
println("arro1.hash=" + arro1.hashcode())
把hashCode输出出来是为了查看地址是否有变化,是不是真的有所改变。
//使用append追加数据,下面同时追加了两个元素,所以append是支持可变参数的,可变参数后面会有一个*号
arro1.append(90.0,13)
println( "arr01.hash=" + arr01.hashcode( ))
运行以上代码:
def append(elemis : A*) { appendAll(elems) }
A 是一个范型,将来是什么类型A就是什么类型。
输出结果如下
D: \program\jdk8\bin\java
Arr01(1)=2
3
2
5
Arr01.hash=110266112
Arr01.hash=-70025354
hashcode 已经发生变化了,如果面试官问可变的 buffer 在 append 过后底层是如何实现的,在学习 JAVA 的时候知道数组本身是不可以变化的,可以联想到一个题目,原数组如果只放了五个元素,如果硬要在这个数组里面加上一个元素,实际上是创建了一个新的数组,需要把原先的数组拷贝过来。在底层用过新的东西之后,地址就发生了变化,这就体现了可变。
此处有一个矛盾点:
按理说输入了 val arr01,它就不能够进行改变,但是因为append底层是创建一个新的对象,然后再把底层返回给新的地址,所以不能和之前的进行混淆,底层在做这个工作了,相当于之前讲的JAVA的扩容。
可以说 ArrayBuffer 是对原来的数组的一个包装/扩展,只是它做得更加完整一些。
//修改[修改值,动态增加]
//使用oppend追加数据,append是支持可变参数
//可以理解成Java的数组的扩容
Arr01.append(90.0,13)//(3,2,5,90,0,13)可以看出是追加了两个数据,所以append 是支持可变参数的,运行带星号
println(arr01.hash=" +arro01.hashcode())
arr01(1)= 89//修改(3,89,5,90,0,13)
Append过后变成了3,89,5,90,0,13,之后进行修改
Printin(“--------------------------”)
for (i <-arro1){
printin(i)
}
//删除,是根据下标进行删除
remove(n: Int)Int 代表下标
remove(n: int, count: int)指定从某个地方删除多少个
如果是不可变的是不会提供 remove 方法的,底层也相当于扩容,原来是添加,现在是减少。
Arr01.remove(0)//(89,5,90,0,13)把数组 remove 掉一个0,一旦 remove 后就会把3拿掉
println("-------删除后的元素遍历----------”)
for (i <- arr01){
println(i)
}
ppintin(“最新的长度="+arr01.length)//长度变成了4
运行结果如下:
89
5
90,0
13
最新的长度=4
三、变长数组分析小结
在处理问题的时候,一定要有一个思路,想好每一步,要做什么,人和人的学习效率是不一样的,努力是一个基本前提,是必要条件,每个人只有努力才能成功,这是肯定的,但是要承认都是努力学习一个小时,别人有可能比自己学的更加明白,更加透彻,所以要把思路体系好好研究一下,学习东西一定要有一个方法。
学完计算机后要,理解人的本质,人的本质就是按照它的机制来运行的,就像JAVA一样,该怎么运行是有流程的。一个对象的创建总是那样进行创建的,只要符合了人的思维方式,学习东西就会特别快,而且还会特别深刻。所以以后要拿出时间来问自己学习效率是不是真的很高。
第一步学了创建,然后紧接着下一步就是访问、查询,查询过后就讲了修改,修改里面包含两个内容,第一个是修改值,第二个是动态的增加,修改完成之后又讲了删除,基本使用就讲解完毕。
1) ArrayBuffer 是变长数组,类似 java 的 ArrayList
2 ) val arr2 = ArrayBuffer[lnt]()也是使用的 apply 方法构建对象
3)def append(elems: A*) { appendAll(elems)}接收的是可变参数.
4)每 append 一次,arr 在底层会重新分配空间,进行扩容,arr2的内存地址会发生变化,也就成为新的 ArrayBuffer