5.数组
MODULE 5 数组
1.数组的特点以及定义
2.数组的操作(存数据,取数据,遍历数据)
3.二维数组(定义,存,取,遍历)
4.知道内存中的:堆,栈
一、数组的定义
1.问题:如果我们想存储一个数组,我们可以使用变量,但是变量一次只能存储一 个数据,所以我们想能不能一次存储多个数据
2.数组概述:是一个容器,数组本身属于引用数据类型
3.作用:一次存储多个数据
4.特点:
(1)既可以存储基本类型的数据,还能存储应用数据类型
(2)定长(定义数组长度为多长,最多能存储多少个数组)
5.定义:
(1)动态初始化:在定义数组的时候,我们没有给具体的数据,只指定了长 度
数据类型【】 数组名 = new 数据类型【长度】
数据类型 数组名【】 = new 数据类型【长度】
各部分解释:
等号左边的数据类型:规定了数组中只能存储什么类型的数据
【】:代表的是数组,一个【】代表一维数组,两个【】【】代表二维 数组
数组名;自己取的名字,遵循小驼峰式
new:代表的是创建数组
等号右边的数据类型:要和等号左边的数据类型一致
【长度】:指定数组的长度,规定了数组最多能存多少个数据
(2)静态初始化:在定义数组的时候,我们直接给了数据
数组类型【】 数组名 = new 数据类型【】{元素1,元素2...} -> 不 推荐使用
数组类型 数组名【】 = new 数据类型【】{元素1,元素2...} -> 不 推荐使用
(3)简化的静态初始化:
数据类型【】 数组名 = {元素1,元素2...} -> 推荐使用
6.动静初始化的区别:
(1)动态初始化:定义的时候只指出了长度,没有存具体的数据当只知道长 度,但不知道具体存什么数据的时候可以使用动态初始化
(2)静态初始化:定义的时候就知道存什么数据了
二、数组的操作
(一)获取数组的长度
1.格式:
数组名.length
2.注意:
length后面不需要带小括号,因为length不是数组中的方法,而是一个属性
(二)索引
1.概述:元素在数组中存储的位置(编号,下标)
2.特点:
(1)索引唯一
(2)索引都是从0开始的,最大索引是数组长度-1
3.索引的作用:
我们将来操作元素,必须通过索引来操作
存数据,要指定索引
取数据,要指定索引
查数据,要指定索引
(三)存储元素
1.格式:
数组名【索引值】 = 值 -> 将符号右边的数据放到数据指定的索引位置上
(四)获取元素
1.格式:
数组名【索引值】
2.细节说明:
(1)直接输出数组名,会输出数组在内存中的地址值
(2)地址值:数组在内存中的一个身份证号,唯一的标识,我们可以通过这 个唯一标识到内存中能找到这个数组,从而操作这个数组中的数据
(3)如果数组中没有存数据,那么直接获取也能获取出来一些数据(默认值)
整数:0
小数:0.0
字符:’\u0000’ -> 对应的int值是0
布尔:false
引用:null
(五)遍历数组
1.遍历:将元素从数组中一个一个的获取出来(循环)
快捷键:数组名.fori
三、操作数组时两个常见问题
(一)数组索引越界异常 ArrayIndexOutOfBoundsException
1.原因:
操作索引超过数组索引范围
(二)空指针异常 NullPinterException
1.原因:
当一个对象为null时,再调用此对象中的其他成员
四、内存图
1.内存:可以理解为“内存条”,所有的软件,程序运行起来都会进入到内存中, 占用内存,在java的世界中,将内存划分成了5块
2.分为哪五块:
(1)栈(Stack)
主要运行方法,方法的运行都会进栈内存运行,运行完毕之后,需要“弹 栈”,为了腾空间
(2)堆(Heap)
保存的是对象、数组,每new一次,都回在堆内存中开辟空间,并为这个 空间分配一个地址值,堆内存中的数据都是有默认值的
整数:0
小数:0.0
字符:‘\u0000’
布尔:false
引用:null
(3)方法区(Method Area)
代码的预备区,记录了类的信息以及方法的信息,方法中主要保存class 文件以及其中的信息,代码运行之前,需要先进内存->方法区
(4)本地方法栈(Native Method Stack):专门运行native方法(本地方法)
本地方法可以理解为堆对java功能的补充
有很多功能,java实现不了,所以需要依靠本地方法完成(c语言编写)
(5)寄存器(pc register):和cpu有关
(一)一个数组的内存图
(二)两个数组的内存图
我们创建了两个数组,在堆内存中开辟了两个不同的空间,此时修改一个空间中的 数据不会影响到另一个空间的数据
(三)两个数组指向同一内存空间
arr2不是new出来的,是arr1直接赋值给的,arr1在内存中保存的是地址值,给 了arr2,那么arr2的地址值和arr1一样,所以此时arr1和arr2指向了堆内存 中同一片空间(同一个地址值,代表的是同一个数组),此时改变一个数组中的元 素会影响到另外一个数组
五、二维数组
(一)二维数组的定义格式
1.概述:数组中套了多个数组
2定义格式:
(1)动态初始化
数据类型【】【】 数组名 = new 数据类型【m】【n】
数据类型 数组名【】【】 = new 数据类型【m】【n】
数据类型【】 数组名【】 = new 数据类型【m】【n】
m:代表的是二维数组的长度
n:代表的是二维数组中每一个一维数组的长度
数据类型【】【】 数组名 = new数据类型 【m】【】 -> 二维数组中的一 维数组没有被创建
(2)静态初始化
数据类型【】【】 数组名 = new 数据类型【】【】{{元素1,元素2...},{元 素1,元素2...}}
数据类型 数组名【】【】 = new 数据类型【】【】{元素1,元素2...},{元 素1,元素2...}}
数据类型【】 数组名【】 = new 数据类型【】【】{元素1,元素2...},{元 素1,元素2...}}
(3)简化静态初始化
数据类型【】【】 数组名 = {{元素1,元素2...},{元素1,元素2...}}
数据类型 数组名【】【】 = {{元素1,元素2...},{元素1,元素2...}}
数据类型【】 数组名【】 = {{元素1,元素2...},{元素1,元素 2...}}
(二)获取二维数组长度
1.格式:
数组名.length
2.获取每一个一维数组,需要先遍历二维数组,将每一个一维数组遍历出
(三)获取二维数组中的元素
1.格式:
数组名【i】【j】
i:代表的是一维数组在二维数组中索引的位置
J:代表的是元素在一维数组中的索引位置
(四)二维数组中存储元素
1.格式:
数组名【i】【j】 = 值
i:代表的是一维数组在二维数组中索引的位置
J:代表的是元素在一维数组中的索引位置
(五)二维数组的遍历
1.先遍历二维数组,将每一个一维数组遍历出来
2.再遍历每一个一维数组,将元素获取出来