MENU

Java-14 引用数据类型:数组

August 22, 2023 • Read: 80 • Java阅读设置

数组

引用数据类型——数组

数组的作用是什么?为什么设置数组这一数据类型?

数组能够对多个相同数据类型的元素进行统一存储和管理。

数组是什么?

数据类型本质上就是具有特定数据表示方式的一定大小的内存空间
决定数据类型的两个关键是:数据表示方式和内存空间的大小。

  • 内存空间的大小:不同数据类型会分配不同大小的内存空间。
  • 数据表示方式:数据表示方式决定数据类型的表数范围,不同数据类型的数据表示方式不同。如具有相同内存空间大小的intfloat类型,由于数据表示方式的不同,它们表数范围就不同。

基本数据类型vs引用数据类型

  • 基本数据类型:理解为内存空间不随数据不同而不同的数据类型,即具有固定大小的内存空间,比如int,只要是int类型,不管多大的数,其内存空间都为4字节
  • 引用数据类型:理解为内存空间随数据不同而不同的数据类型,比如String,不同长度的String类型的数据,占用的内存空间大小是不同的。
    因此,相同基本数据类型的数据占用着固定大小的内存空间,而相同引用数据类型的数据,则可能占用不同大小的内存空间,存在长度这一属性来指明数据的大小。

数组(Array),是多个相同数据类型的数据,按照一定的顺序排列的集合,可以通过索引的方式对这些数据进行统一管理。

  • 数组本质上就是一整块连续的内存空间,其大小由数组长度数组元素的数据类型决定。
  • 数组可以理解为:多个相同数据类型连续排在一起所构成的整体。
    因此,定义一个数组需要定义两个点:元素的数据类型,元素的个数。
  • 数组的顺序型:由于数组是一整块连续的内存空间,这个空间确定后,内部的每个固定大小的内存空间的位置也就是确定的。
    顺序性可以理解为每个数组的索引,比如0,其所指向的数组中的固定大小的内存空间是固定的。
  • 数组的索引:将数组中每个固定大小的内存空间,从第一个到最后一个,从0开始按顺序标识,这个标识即编号就是数组的索引。
    2023-08-22T03:44:19.png

一维数组

声明和初始化
任何一种数据类型的变量的定义,包括声明初始化两个步骤。定义的完成代表内存空间的分配完成,也就是说,这两个步骤都完成时,才完成了内存空间的分配。

任何一种数据类型的变量的声明的格式为:数据类型 变量名,如int num1;
一维数组的变量的声明格式为:Datatype[] variable_name,如int[] num1,表示num1这个变量是int型的数组。

任何一种数据类型的变量的初始化,就是给变量赋值,这步的完成就代表完成了内存空间的分配。
一维数组的变量的初始化有两种方式:

  • 静态初始化:数组的初始化和数组元素的赋值操作同时进行。
    初始化格式为:array_name = new Datatype[]{e1, e2, ..., en}
  • 动态初始化:仅完成数组的初始化。
    初始化格式为:array_name = new Datatype[array_length]

一维数组的定义的两种方式:

  • 先声明后初始化
  • 声明和初始化同时进行

2023-08-22T10:38:24.png

数组元素的调用
通过索引来调用数组中的元素,索引是从0开始,即索引的最大值为数组长度-1
调用一维数组的元素的格式为:array_name[index]

数组的长度
引用数据类型本质上是一个类,定义的变量本质上是对象,具有length属性,通过该属性能够获取对象的长度。
获取数组长度的格式:array_name.length

2023-08-22T10:45:31.png

数组元素的默认初始化值
数组元素的默认初始化值是指完成了对数组对象的定义,但没有对数组元素进行赋值时,定义的数组中元素默认的初始的值。

不同类型的数组元素,其默认初始化值不同:

  • 整型(byte, short, int, long):0
    2023-08-22T13:04:41.png
  • 浮点型(float, double):0.0
    2023-08-22T13:10:43.png
  • 字符型(char):0,不是'0'。相当于ASCII码为0对应的字符,显示出来和空格一样,但并非是空格。
    2023-08-22T13:12:42.png
    2023-08-22T13:16:23.png
  • 布尔型(boolean):false
    2023-08-22T13:20:31.png
  • 引用数据类型(String等):null
    2023-08-22T13:22:58.png

总结:

  • 基本数据类型的默认值为0对应的该类型的数据。
  • 引用数据类型的默认值为null

数组的内存解析
内存中是如何为数组分配空间的?

  1. 内存的简单结构:
    数据类型这部分,重点关注
  2. :存放局部变量。
  3. :存放new出来的结构,比如对象数组
    2023-08-22T13:30:37.png
  4. 一维数组的内存解析
    2023-08-22T13:32:08.png

可以得出这样的结论:

  • 所有定义好的非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,完成初始化的引用数据类型的元素的默认值为指针指向的地址值

练习
2023-08-23T13:23:39.png
2023-08-23T13:22:57.png

快捷键note

  • ctrl + D:删除。
  • ctrl + shift + F:同Source-->Format,自动调整格式。可能是因为输入法热键冲突,可以通过取消输入法快捷键功能,本人电脑(老破旧小米)的这个快捷键表示切换输入法为繁体字模式。
  • shift + enter:在当前行下一行插入空行并且光标自动到下一行。相当于enter一行。
  • ctrl + shift + enter:在当前行上一行插入空行并且光标自动到上一行。

二维数组

二维数组是什么

  • 二维数组本质上就是一维数组。
    一维数组中的元素的数据类型也为一维数组时,人们将这样的一维数组称为二维数组。
  • 从数组的底层的运行机制来看,没有多维数组。

声明和初始化
1 声明
任何一种数据类型的声明格式为:数据类型 变量名

一维数组声明格式为:数据类型[] array_name,其中数据类型表示元素的数据类型,[]表示数组。
因此数据类型[]表示数组这一数据类型:元素数据类型为指定数据类型的数组。

由于二维数组本质上就是一维数组,因此二维数组声明格式为:数据类型[][] array_name
其中最开始的数据类型[]相当于一维数组声明中的数据类型,即数据类型[]表示元素数据类型为一维数组,之后的[]相当于一维数组声明中的[]即表示数组。
因此数据类型[][]表示:元素数据类型为一维数组的数组。

2 初始化
1)静态初始化
在一维数组中,静态初始化表示对数组初始化的同时,对数组元素赋值。

赋值,表示元素的确定。

完成数组的声明和初始化,就是要完成对数组两个关键点的定义:元素数据类型和长度。
声明,完成的是对数组元素的数据类型的定义。
初始化,完成的是对数组元素的个数即数组长度的定义。

二维数组本质上是一维数组。
因此,二维数组的静态初始化,是完成对数组长度的定义的同时,完成对数组元素即一维数组的赋值。
一维数组的赋值,即确定一个一维数组,即确定一维数组的长度和元素。
2023-08-24T03:25:18.png

2)动态初始化
动态初始化是指,仅完成数组的初始化,元素不确定。

由于二维数组本质上就是一维数组。
因此,二维数组的动态初始化,是仅完成对数组长度的定义,元素不确定。

由于二维数组的元素为一维数组,而一维数组的不确定可以分为两种情况:

  • 长度不确定,此时元素更不可能确定。
  • 长度确定,元素不确定。

因此,二维数组的动态初始化分为两种情况:

  • 完成数组长度的定义,数组元素即一维数组的长度不确定(元素也不确定)。
    2023-08-24T03:31:00.png
  • 完成数组长度的定义,数组元素即一维数组的长度确定,元素不确定。
    2023-08-24T03:31:13.png

3 声明和初始化的其他非标准但正确的情况

  • 若声明的同时进行静态初始化(在同一行),此时可以省略new 数据类型[][]new 数据类型[]
    2023-08-24T03:33:39.png
  • []除了不能放在第一个位置,其他位置都可以放。
    2023-08-24T03:36:26.png

元素的调用
一维数组元素的调用格式:array_name[index],其中array_name表示数组名,index表示该数组中元素的索引。

二维数组本质上是一维数组,其元素的调用格式:array_name[index1][index2],其中array_name表示数组名,index1表示该数组中元素的索引,由于元素本身又是一维数组,因此index2表示元素的元素的索引。

由此可知,二维数组元素调用一般是指二维数组中元素的元素的调用。

array_name[index]即表示调用二维数组的元素,此时若元素即一维数组的长度确定即完成了一维数组的初始化,值为地址值,若仅完成了二维数组长度的定义即二维数组的初始化,值为null
2023-08-24T03:59:30.png

如何完成对二维数组中元素的初始化或者赋值?
只要记住一点,二维数组本质上是元素为一维数组的数组。
因此,对二维数组中的元素初始化或赋值,就是对一维数组初始化或赋值,只不过该一维数组的数组名为二维数组的索引。
2023-08-24T04:04:24.png
2023-08-24T04:04:47.png

获取数组的长度

  • 获取二维数组的长度:array_name.length
  • 获取二维数组元素的长度:array_name[index].length
    2023-08-24T04:09:11.png
    2023-08-24T04:09:20.png

二维数组元素的值
参考数组的内存解析部分。

二维数组的内存解析
本质上同前面的数组的内存解析部分。
2023-08-24T04:14:21.png

练习
1 二维数组中元素的遍历
2023-08-25T07:25:51.png
2023-08-25T07:26:03.png
2 明确数组声明的含义
2023-08-25T07:26:57.png
3 杨辉三角
2023-08-25T07:47:31.png
2023-08-25T07:48:12.png
4 一维数组赋值
2023-08-26T07:09:27.png
2023-08-26T07:09:38.png

Last Modified: October 27, 2023