数组
引用数据类型——数组
数组的作用是什么?为什么设置数组这一数据类型?
数组能够对多个相同数据类型的元素进行统一存储和管理。
数组是什么?
数据类型本质上就是具有特定数据表示方式
的一定大小的内存空间
。
决定数据类型的两个关键是:数据表示方式和内存空间的大小。
内存空间的大小
:不同数据类型会分配不同大小的内存空间。数据表示方式
:数据表示方式决定数据类型的表数范围,不同数据类型的数据表示方式不同。如具有相同内存空间大小的int
和float
类型,由于数据表示方式的不同,它们表数范围就不同。
基本数据类型vs引用数据类型
- 基本数据类型:理解为内存空间不随数据不同而不同的数据类型,即具有固定大小的内存空间,比如
int
,只要是int
类型,不管多大的数,其内存空间都为4字节
。 - 引用数据类型:理解为内存空间随数据不同而不同的数据类型,比如
String
,不同长度的String
类型的数据,占用的内存空间大小是不同的。
因此,相同基本数据类型的数据占用着固定大小的内存空间,而相同引用数据类型的数据,则可能占用不同大小的内存空间,存在长度
这一属性来指明数据的大小。
数组(Array),是多个相同数据类型的数据,按照一定的顺序排列的集合,可以通过索引的方式对这些数据进行统一管理。
- 数组本质上就是一整块连续的内存空间,其大小由
数组长度
和数组元素的数据类型
决定。 - 数组可以理解为:多个相同数据类型连续排在一起所构成的整体。
因此,定义一个数组需要定义两个点:元素的数据类型,元素的个数。 - 数组的顺序型:由于数组是一整块连续的内存空间,这个空间确定后,内部的每个固定大小的内存空间的位置也就是确定的。
顺序性可以理解为每个数组的索引,比如0
,其所指向的数组中的固定大小的内存空间是固定的。 - 数组的索引:将数组中每个固定大小的内存空间,从第一个到最后一个,从
0
开始按顺序标识,这个标识即编号就是数组的索引。
一维数组
声明和初始化
任何一种数据类型的变量的定义,包括声明
和初始化
两个步骤。定义的完成代表内存空间的分配完成,也就是说,这两个步骤都完成时,才完成了内存空间的分配。
任何一种数据类型的变量的声明的格式为:数据类型 变量名
,如int num1;
。
一维数组的变量的声明格式为:Datatype[] variable_name
,如int[] num1
,表示num1
这个变量是int
型的数组。
任何一种数据类型的变量的初始化,就是给变量赋值,这步的完成就代表完成了内存空间的分配。
一维数组的变量的初始化有两种方式:
- 静态初始化:数组的初始化和数组元素的赋值操作同时进行。
初始化格式为:array_name = new Datatype[]{e1, e2, ..., en}
。 - 动态初始化:仅完成数组的初始化。
初始化格式为:array_name = new Datatype[array_length]
。
一维数组的定义的两种方式:
先声明后初始化
声明和初始化同时进行
数组元素的调用
通过索引来调用数组中的元素,索引是从0开始,即索引的最大值为数组长度-1
。
调用一维数组的元素的格式为:array_name[index]
。
数组的长度
引用数据类型本质上是一个类,定义的变量本质上是对象,具有length
属性,通过该属性能够获取对象的长度。
获取数组长度的格式:array_name.length
。
数组元素的默认初始化值
数组元素的默认初始化值是指完成了对数组对象的定义,但没有对数组元素进行赋值时,定义的数组中元素默认的初始的值。
不同类型的数组元素,其默认初始化值不同:
- 整型(byte, short, int, long):
0
- 浮点型(float, double):
0.0
- 字符型(char):
0
,不是'0'。相当于ASCII码为0对应的字符,显示出来和空格一样,但并非是空格。 - 布尔型(boolean):
false
。 - 引用数据类型(String等):
null
总结:
- 基本数据类型的默认值为
0
对应的该类型的数据。 - 引用数据类型的默认值为
null
。
数组的内存解析
内存中是如何为数组分配空间的?
- 内存的简单结构:
在数据类型
这部分,重点关注栈
和堆
。 栈
:存放局部变量。堆
:存放new出来的结构
,比如对象
、数组
。- 一维数组的内存解析
可以得出这样的结论:
- 所有定义好的非
new出来的结构
,直接存在当前开辟的空间中。
比如int x = 0
,理解为栈中开辟了一个int
型空间,该空间命名为x
,该空间中的数据为0
,再比如int[] x = new int[]{1, 2, 3}
,其中的1, 2, 3
定义好的int
型数据,直接存在堆中开辟的int[0], int[1], int[2]
对应的空间中。 - 所有定义好的
new出来的结构
,存在由当前开辟空间中指针所指向的空间中,因此当前开辟空间中的数据为指针所指向的空间的地址。
可以将定义好的new出来的结构
的定义过程这样理解:1)完成声明代表完成了一个对应类型的指针创建,此时指针没有指向任何地址。2)完成初始化代表完成了指针的指向,此时指针指向了一个地址,但并没有完成空间的完全分配,只有当赋值完成时,空间的分配才会完成。因此,地址的作用就是表示空间的分配是在该地址的基础上来分配的。 - 定义好的
new出来的结构
如数组中,未完成赋值的基本数据类型的元素的默认值为0
对应的该数据类型的值。 - 定义好的
new出来的结构
如数组中,未完成初始化的引用数据类型的元素的默认值为null
,完成初始化的引用数据类型的元素的默认值为指针指向的地址值
。
练习
快捷键note
ctrl + D
:删除。ctrl + shift + F
:同Source-->Format
,自动调整格式。可能是因为输入法热键冲突,可以通过取消输入法快捷键功能,本人电脑(老破旧小米)的这个快捷键表示切换输入法为繁体字模式。shift + enter
:在当前行下一行插入空行并且光标自动到下一行。相当于enter
一行。ctrl + shift + enter
:在当前行上一行插入空行并且光标自动到上一行。
二维数组
二维数组是什么
- 二维数组本质上就是一维数组。
一维数组中的元素的数据类型也为一维数组时,人们将这样的一维数组称为二维数组。 - 从数组的底层的运行机制来看,没有多维数组。
声明和初始化
1 声明
任何一种数据类型的声明
格式为:数据类型 变量名
。
一维数组
的声明
格式为:数据类型[] array_name
,其中数据类型
表示元素的数据类型,[]
表示数组。
因此数据类型[]
表示数组
这一数据类型:元素数据类型为指定数据类型的数组。
由于二维数组本质上就是一维数组,因此二维数组
的声明
格式为:数据类型[][] array_name
。
其中最开始的数据类型[]
相当于一维数组声明中的数据类型
,即数据类型[]
表示元素数据类型为一维数组
,之后的[]
相当于一维数组声明中的[]
即表示数组。
因此数据类型[][]
表示:元素数据类型为一维数组
的数组。
2 初始化
1)静态初始化
在一维数组中,静态初始化表示对数组初始化的同时,对数组元素赋值。
赋值,表示元素的确定。
完成数组的声明和初始化,就是要完成对数组两个关键点的定义:元素数据类型和长度。
声明,完成的是对数组元素的数据类型的定义。
初始化,完成的是对数组元素的个数即数组长度的定义。
二维数组本质上是一维数组。
因此,二维数组的静态初始化,是完成对数组长度的定义的同时,完成对数组元素即一维数组的赋值。
一维数组的赋值,即确定一个一维数组,即确定一维数组的长度和元素。
2)动态初始化
动态初始化是指,仅完成数组的初始化,元素不确定。
由于二维数组本质上就是一维数组。
因此,二维数组的动态初始化,是仅完成对数组长度的定义,元素不确定。
由于二维数组的元素为一维数组,而一维数组的不确定可以分为两种情况:
- 长度不确定,此时元素更不可能确定。
- 长度确定,元素不确定。
因此,二维数组的动态初始化分为两种情况:
- 完成数组长度的定义,数组元素即一维数组的长度不确定(元素也不确定)。
- 完成数组长度的定义,数组元素即一维数组的长度确定,元素不确定。
3 声明和初始化的其他非标准但正确的情况
- 若声明的同时进行静态初始化(在同一行),此时可以省略
new 数据类型[][]
或new 数据类型[]
。 []
除了不能放在第一个位置,其他位置都可以放。
元素的调用
一维数组元素的调用格式:array_name[index]
,其中array_name
表示数组名,index
表示该数组中元素的索引。
二维数组本质上是一维数组,其元素的调用格式:array_name[index1][index2]
,其中array_name
表示数组名,index1
表示该数组中元素的索引,由于元素本身又是一维数组,因此index2
表示元素的元素的索引。
由此可知,二维数组元素调用一般是指二维数组中元素的元素的调用。
array_name[index]
即表示调用二维数组的元素,此时若元素即一维数组的长度确定即完成了一维数组的初始化,值为地址值,若仅完成了二维数组长度的定义即二维数组的初始化,值为null
。
如何完成对二维数组中元素的初始化或者赋值?
只要记住一点,二维数组本质上是元素为一维数组的数组。
因此,对二维数组中的元素初始化或赋值,就是对一维数组初始化或赋值,只不过该一维数组的数组名为二维数组的索引。
获取数组的长度
- 获取二维数组的长度:
array_name.length
。 - 获取二维数组元素的长度:
array_name[index].length
。
二维数组元素的值
参考数组的内存解析
部分。
二维数组的内存解析
本质上同前面的数组的内存解析
部分。
练习
1 二维数组中元素的遍历
2 明确数组声明的含义
3 杨辉三角
4 一维数组赋值