本节目标
1.数组的基本概念
1.1为什么要使用数组
假设现在要存5个学生的javaSE考试成绩,并对其进行输出,按照之前掌握的知识点,那么我会写出以下代码:
上述代码没有任何问题,但不好的是:如果有20名同学的成绩呢,需要创建20个变量吗?仔细观察这些学生的成绩发现:所有成绩的类型都是相同的,那java中存在可以储存相同变量多个数据的类型吗?这就是本节的数组。
1.2什么是数组
总结:
1.3数组的创建及初始化
1.3.1数组的创建
演示:
补充:(1)array叫做引用变量,简称引用(因为array存储的是数组第一个元素的地址);(2)数组的具象表现如下图所示:
(3)数组有两种语法形式
1.3.2数组的初始化
数组的初始化主要分为动态初始化以及静态初始化
1.动态初始化:在创建数组时,直接指定数组中元素的个数
语法形式:
注意:
2.静态初始化:在创建数组时不直接指点数据元素个数,而直接将具体的数据内容进行指定
语法形式:
提醒:
注意:(1)不建议使用c++中的数组形式(int array[]),因为int[]是类型,array是变量,java的形式会更加清晰不会搞混;
(2) 数组初始化的错误示范
原因:[]和{}两个括号中不能同时有元素在
解析:动态和静态初始化可以分为两步,但是省略式不可以分布
(3)如果没有对数组进行初始化,数组中元素有默认值
1.4数组的使用
1.4.1数组中元素访问
数组在内存中是一段连续的空间,空间编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。
演示:
注意:
演示异常:
这个报错是数组越界异常,双引号后面的Index 15 out of bounds for length 6 是告诉你错误的原因
1.4.2遍历数组
所谓“遍历”是指将数组中的所有元素都访问一遍,访问是指对数组中的元素进行某种操作,比如:打印
演示遍历数组的打印:
法一:for循环
注意:在数组中可以通过数组对象.length来获取数组的长度
法二:for each循环
演示:
语法形式:冒号左边是数据类型,右边是数组名称
辨析:fori循环和foreach循环的区别——foreach循环无法获取到对应的下标
法三:用工具遍历数组
用操作数组类的工具Arrays中的toString方法
演示:
详细过程:
tips:如果只是单独想查看数组里的元素用Arrays的方法会比较便捷!
2.数组是引用类型
2.1初始JVM的内存分布
内存是一段连续的存储空间,主要用来存储程序运行时数据的。
问题:
1.为什么要划分内存
如上图所示,为了使其更加的规则有序所以我们给内存划分了不同的区域
2.划分成了哪些内存
各部分的详细内容:
补充:为什么会有两个栈,它们之间有什么区别?
2.2基本类型变量于引用类型变量的区别
举例:
如上图所示:
为了更加清楚的了解栈和堆之间的关系,我们接下来用图来理解
补充:局部变量都会在栈上开辟内存,而对象会在堆里开辟内存
从上图可以看到,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。有点类似c语言中的指针,但是java中的引用要比指针的操作更简单
2.3再谈引用变量
演示代码:
画图分析:
接下来我们将会对每一行代码逐句解读
第一行代码执行后(因为只是对数组进行定义,里面的值都是默认值)
之后的二到四行代码执行后:
第五行代码:
之后的第六行代码:
第七行代码(重点):
此时我们会说array1这个引用指向了array2这个引用所指的对象,但我们发现一个问题,之前array1指向的对象去哪里了?
结果————如果这个对象一直没有人引用他,此时就会被JVM自动回收
第七到九行代码:
如果两个引用同时指向一个对象的时候,操作任意一个引用都可以修改这个对象的值
2.4认识null
演示:
此时我们不会说是array2执行null,而是会说array2这个引用不指向任何对象
常见案例:
空指针异常
结果:
原因:我们使用了null.xxx,例如在本示例中的array2就是等于null的,所以array2.length就是null.xxx的形式
总结解决办法:如果将来代码报错空指针异常,那么我们要做的是找到这行代码中的引用,判断这个引用为什么是空的!
演示:
同理可得这种情况也会有空指针异常
总结:
3.数组的应用场景
3.1保存数据
演示:
3.2作为函数的参数
3.2.1参数传基本数据类型
发现在func方法中修改x的值,不影响实参的num值
2.参数传数组类型(引用数据类型)
需求:把数组当中的每个数据扩大两倍
参考:
、
接下来用画图来理解代码:
传参前:
传参后:
当返回ret的时候:
注意:当函数结束的时候,局部变量的值会被回收
所以综上所述演示的是引用的赋值(数组)!
变式:在原来数组上扩大两倍
用画图理解:
进入函数前:
进入函数后:
函数结束后:
通过上面两个代码我们可以发现,传引用可以改变实参的值,也可以不改变形参的值
为了方便理解传引用,我们再举两个简单一些的例子:
演示:
类型一:
类型二:
画图理解:
传参前:
传参后:
总结:一个引用不可能同时指向多个对象
3.3作为函数返回值
参考:
小结:
1.int[] array = null ;代表这个引用不指向任何对象
2.array 1 = array 2 ;代表array1这个引用指向来了array2这个引用所指向的对象
3.一个引用不可能同时指向2个对象
4.数组练习
4.1数组转换字符串
尝试写一个自己的方法
参考:
在java中提供了java.util.Arrays包,其中包含了一些数组常用方法,这样我们可以直接使用转换的方法,而不用每次都自己书写
演示:
4.2数组拷贝
4.3求数组中元素的平均值
要求:给定一个整型数组,求平均值