ArrayBuffer 的基本使用 | 学习笔记

简介: 快速学习 ArrayBuffer 的基本使用

开发者学堂课程【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 .ArrayBufferArrayBuffer 是可变的,如果以后找可变的就按照这个程序)

光标定位在 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

相关文章
|
前端开发
【前端】elementUI表格根据状态显示不同的字体颜色
【前端】elementUI表格根据状态显示不同的字体颜色
725 1
|
缓存 资源调度
解决安装依赖时报错:npm ERR! code ERESOLVE
解决安装依赖时报错:npm ERR! code ERESOLVE
5589 0
解决安装依赖时报错:npm ERR! code ERESOLVE
|
JSON Java 应用服务中间件
HttpServletRequest核心方法以及获取请求参数
HttpServletRequest核心方法以及获取请求参数
2659 0
|
API 开发者
WebSocket API 中的 onerror 事件和 close 事件有什么不同?
【10月更文挑战第26天】`onerror`事件侧重于通知开发者WebSocket连接过程中出现的错误,以便进行相应的错误处理和恢复;而`close`事件则主要用于在连接关闭时进行资源清理和根据关闭情况采取适当的后续操作。两者在WebSocket应用的开发中都起着重要的作用,帮助开发者更好地管理和处理WebSocket连接的各种情况。
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
1671 11
|
API UED 容器
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
1372 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
|
前端开发
使用ffmpeg-core的时候报错,解决Uncaught (in promise) ReferenceError: SharedArrayBuffer is not defined
使用ffmpeg-core的时候报错,解决Uncaught (in promise) ReferenceError: SharedArrayBuffer is not defined
|
SQL 安全 关系型数据库
SQL授权用户查看表的详细步骤与技巧
在数据库管理中,控制不同用户对数据的访问权限是至关重要的
|
Ubuntu 应用服务中间件 网络安全
Tomcat 下载
【7月更文挑战第16天】
795 4
|
编解码 前端开发 JavaScript
前端移动端适配方案
【9月更文挑战第8天】前端移动端适配方案
696 0