1. 数组概述

1.1 数组的理解

数组(Array),是多个相同数据类型按一定顺序排列的集合,并由一个变量所管理

1.2 数组的相关概念

  • 数组名:即用来声明数组的变量名
  • 元素:数组中所包含的数据的统称
  • 索引(又叫角标、下标):数组中元素的位置,从0开始依次递增
  • 长度:即数组中元素的个数

1.3 数组的特点

  1. 数组是有序排列的
  2. 数组属于引用类型变量。但是数组的元素既可以是基本数据类型,也可以是引用数据类型。
  3. 创建数组对象时会在内存中开辟一块连续的空间
  4. 数组的长度一旦确定,则无法更改。若实际使用中需要进行长度变更,则需要重新创建一个数组。

1.4 数组的分类

  • 按维度:一维数组、二维数组、三维数组。。。。。。
  • 按数组元素类型:基本数据类型的数组、引用数据类型的数组。

2. 一维数组

2.1 一维数组的声明与初始化

  • 静态初始化:初始化时直接对元素进行赋值:

    int[] arr = new int[]{1, 2, 3, 4, 5};
    int[] arr2 = {1, 2, 3, 4, 5};//由于new int[] 是固定的,故可以省去(Java 类型推断机制)
  • 动态初始化:数组初始化与赋值操作分开进行

    int[] arr3 = new int[5];
    arr3[0] = 1;
    
    String[] arr4 = new String[5];
    arr4[3] = "coding";

2.2 一维数组元素的引用

数组中元素通过角标的形式进行调用,角标从0开始,到数组长度-1结束

arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;

2.3 一维数组的属性:length

System.out.println(arr.length);
注意:数组一旦初始化,其长度就是固定的

2.4 一维数组的遍历

for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

2.5 一维数组元素的默认值

数组的第二种初始化方式中,由于预先划分好了数组的空间,但是并没有对元素进行赋值,故存在默认值问题。一维数组初始化时各个类型元素的默认值如下:

  • 整型:0
  • 浮点型:0.0
  • 布尔型:false
  • 引用类型:null
记忆技巧:不管是哪种类型元素,在初始化时都会将内存中的二进制位置0,反应成具体的数据类型即为上述内容。要注意引用类型默认是null,不可以直接进行使用。

2.6 一维数组内存结构

image-20210215193230951.png
如图所示,数组声明时会在栈中分配一块空间,用于存储数组第一个元素在堆中的首地址。若使用静态初始化方式,则先在栈中开辟一块空间,然后在堆中分配对应的元素存放区域,将栈中开辟的空间的值设为首元素的地址,类似于C中的指针。若使用动态初始化,则没有为元素赋值这一步,直接分配空间后使用其默认值。

3. 二维数组

理解:数组属于引用数据类型,由于数组的元素也可以是引用数据类型,则如果一个数组的所有元素都是一个一维数组,那么这个数组可以称为二维数组。

2.1 二维数组的声明与初始化

  • 静态初始化

    int[][] arr = new int[][] { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8 } };
    int[][] arr1 = { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8 } };
    
  • 动态初始化

    // 方式1
    int[][] arr2 = new int[3][2];
    // 方式2
    int[][] arr3 = new int[3][];// 列的元素个数可以省略

2.2 二维数组元素的引用

二维数组的每一个维度都通过索引进行引用,与一维数组一样,都是从0开始

System.out.println(arr1[0][2]);// 先行后列
System.out.println(arr2[1][2]);

2.3 二维数组的属性:length

System.out.println(arr.length);// 行数
System.out.println(arr[i].length);// 第 i 行元素个数,即二维数组中第i个数组的长度

2.4 二维数组的遍历

for (int i = 0; i < arr3.length; i++) {
    for (int j = 0; j < arr3[i].length; j++) {
        System.out.print(arr3[i][j] + "\t");
    }
    System.out.println();
}
推论:数组维数越高,遍历时使用的循环嵌套层数就越高,且为一一对应关系,即几维数组就使用几层循环。

2.5 二维数组元素的默认值

假设二维数组的两个维度分别为外层数组和内层数组,对应的元素为外层元素和内层元素。

int[][] arr = new int[4][3];中,外层元素为arr[0]arr[1]等,内层元素为arr[0][3]arr[1][2]等。则:

  • 初始化方式一int[] arr = new int[4][3]

    • 外层元素:地址值
    • 内层元素:与一维数组初始化情况相同
  • 初始化方式二int[] arr = new int[4][]

    • 外层元素:null
    • 内层元素:不可调用,会报空指针异常

2.6 二维数组内存结构

image-20210215195802649.png
如图所示,声明一个二维数组时相当于声明了一个元素为地址类型的一维数组,每个元素的地址都指向另一个一维数组的首元素地址,因此二维数组本质上也是一个一维数组,只不过元素变成了其它的一维数组。

最后修改:2021 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏