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.再遍历每一个一维数组,将元素获取出来

(六)二维数组内存划分

posted @ 2024-09-05 19:48  dededea  阅读(7)  评论(0编辑  收藏  举报