首页 > 编程笔记

Java 数组(一维数组和二维数组)的用法

单个变量只能存储一个数据,为了方便存储一组同一数据类型的多个数据,和绝大部分计算机语言一样,Java 提供了数组。

在 Java 中较为常用的数组是一维数组和二维数组,将数组和循环结构相结合可以解决许多复杂的问题。

一维数组

一维数组是一种线性数组,访问一维数组中的元素涉及单个下标,它可以表示行索引或列索引。

一维数组的示意图如下:


图 1 一维数组的示意图

1) 一维数组的声明

声明一维数组的语法格式如下:
数据类型[] 数组名;
数据类型 数组名[];
从面向对象的角度来看,推荐采用第一种声明方式,因为它把“元素数据类型[]”看成一个整体类型,即数组类型。

这里需要注意的是,数组不是基本数据类型而是引用类型。即使是用于存储基本数据类型数据的数组,本身的数据类型也是引用类型。

2) 一维数组的创建(动态初始化)

数组声明完成后,数组的长度还不能确定,Java 虚拟机还没有为元素分配内存空间。数组的创建过程,就是 Java 虚拟机在堆空间(Heap)中为数组元素分配内存空间并返回地址的过程。

动态初始化就是使用 new 运算符分配指定长度的内存空间,语法格式如下:
数组名 = new 数组元素类型[元素个数];
需要注意的是,数组的声明和内存空间的分配可以在声明时同时完成,例如:
int[] arr = new int[4]; // 创建一个长度为 4 个数组

3) 数组的静态初始化

可以在声明一个数组的同时对数组中的每个元素进行赋值,语法格式如下:
数据类型[] 数组名 = {初值表};
例如:
int[] arr = {1,2,3,4};
也可以将声明和初始化过程分开进行,例如:
int[] arr;
arr = new int[]{1,2,3,4}; // ①
注意,① 处的语句不可以写成arr={1,2,3,4};

4) 数组元素的初始化

在创建数组时,Java 虚拟机会根据数组元素的类型自动赋初值:
例如:
int[] arr = new int[4]; //{0,0,0,0}

5) 一维数组的长度

一维数组中元素的个数称为数组的长度。对于一维数组,“数组名.length”的值就是数组中元素的个数。

例如:
float[] a = new float[10]; // a.length 的值为 10

6) 一维数组的访问

对一个数组中的元素进行访问是通过数组的下标实现的。下标是数组为其中的元素默认提供的访问索引。

在 Java 中,数组的下标从 0 开始,长度为 n 的数组的下标合法的取值范围为 0~n-1。在程序运行过程中,如果数组的下标超过这个范围就会抛出下标越界异常,即 IndexOutOfBoundsException。

例如:
int[] arr = new int[4]; // 创建一个长度为4的整型数组 
System.out.println(arr[0]); // 读取数组中下标为0的元素的值,输出结果为0 
arr[0] = 5; // 为数组中下标为0的元素赋值 
System.out.println(arr[0]); // 再次读取数组中下标为0的元素的值,输出结果为5

【实例】一维数组的应用。
public class Test { 
    public static void main(String[] args) { 
        // 0, 0, 0, 0 
        int[] arr = new int[4]; 
        System.out.println(arr[0]);
        arr[0] = 8; 
        arr[1] = 10; 
        arr[2] = 30; 
        arr[3] = 100; 
 
        // arr[4] = 10; // 这行会导致 ArrayIndexOutOfBoundsException 异常,因为数组下标是从0到3 
 
        System.out.println(arr[0]); // 输出:8 
        System.out.println(arr[1]); // 输出:10 
        System.out.println(arr[2]); // 输出:30 
        System.out.println(arr[3]); // 输出:100 
 
        // 数组相当于存储了一组变量,每个元素都是一个变量 
        int n = arr[2] + arr[1] * 10; 
        System.out.println(n); // 输出:310 (30 + 10 * 10) 
 
        System.out.println(arr.length); // 输出:4,利用length可以读取数组的长度 
 
        double[] arr1 = new double[3]; 
 
        System.out.println(arr1[0]);
 
        arr1[0] = 35.0; 
        System.out.println(arr1[0]); // 输出:35.0 
 
        // 使用已知数据直接初始化数组中的元素 
        int[] arr2 = new int[]{9, 19, 23, 65, 8}; 
 
        System.out.println(arr2[2]); // 输出:23 
 
        // 简写形式:只能在声明数组的同时进行初始化 
        int[] arr3 = {9, 19, 23, 65, 8}; 
 
        // 声明后必须初始化才能使用 
        int[] arr4; 
        // arr4 = { 5, 2 , 4 , 5 }; // 编译错误,不能在声明后单独初始化 
        arr4 = new int[]{5, 2, 4, 5}; // 正确的初始化方式 
 
        // 字符数组 
        char[] chars = new char[5];
        // 编号为 0 的字符是控制字符,输出基本没有效果 
        System.out.println(chars[0]);
        // 转换为int型值输出,结果为字符'\u0000'的ASCII码值,即0 
        System.out.println((int)chars[0]); // 输出:0 
    } 
}
输出结果为:

0
8
10
30
100
130
4
0.0
35.0
23

0

7) 数组的遍历

数组的遍历是指按照特定的顺序访问数组中的全部元素,这是数组使用中的一类特别常见的操作。

例如,遍历数组中的元素,查找满足特定条件的元素。数组的遍历一般是通过循环实现的,如 for 循环。

【实例】使用 for 循环遍历数组。
public class Test { 
    public static void main(String[] args) { 
        int[] array = new int[100]; 
 
        // 将数组中的元素设为1到100 
        for (int i = 0; i < array.length; i++) {
            array[i] = i + 1; 
        } 
 
        // 输出数组中所有13的倍数 
        for (int i = 0; i < array.length; i++) { 
            if (array[i] % 13 == 0) { 
                System.out.print(array[i] + " ");
                // 13 26 39 52 65 78 91 
            } 
        } 
    } 
}
输出结果为:

13 26 39 52 65 78 91

二维数组

当数组中的元素也是一维数组时,将该数组称为二维数组,示意图如下:


图 2 二维数组的示意图

二维数组的每行的元素个数可能不同,所以也称为锯齿数组。

1) 二维数组的声明

声明二维数组的语法格式如下:
数据类型[][] 数组名;
数据类型 数组名[][];

2) 二维数组的创建(动态初始化)

创建二维数组的语法格式如下:
数组名 = new 数据类型[元素个数][];
例如:
// 声明二维数组时至少要给出第一维的长度,即确定行数
// 每行元素的个数还不确定
int[][] ia = new int[3][];

// 创建一个 3 行 4 列的二维数组
int[][] ib = new int[3][4];

3) 数组元素的初始化

和一维数组一样,在创建二维数组时 Java 虚拟机会根据数组元素的类型自动赋初值。

例如:
int[][] ia = new int[3][];  // {null, null, null}
int[][] ib = new int[3][2]; // {{0,0},{0,0},{0,0}}

4) 二维数组的创建(静态初始化)

创建二维数组的语法格式如下:
数据类型 数组名[][] = {{初值表}, {初值表}};

例如:
int[][] a = {{1,2,3,4},{5,6},{7,8,9}};

5) 二维数组的长度

length 是数组的一个属性,用来表示数组的长度。但对于二维数组来说,“数组名.length”的值是它包含的一维数组的个数。例如:
int[][] b = new int[2][5]; // 创建一个二维数组,外层数组长度为2,内层数组长度为5 
// 输出外层数组的长度,即二维数组的行数 
System.out.println(b.length); // 输出2 
// 输出内层数组的长度,即二维数组的列数(假设所有内层数组长度相同) 
System.out.println(b[0].length); // 输出5 

6) 二维数组的访问

通过“数组名[行下标][列下标]”的方式来访问二维数组的元素。例如,a.length 代表行数,a[i].length 代表第 i 行的元素的个数。

使用二重循环遍历二维数组的程序片段如下所示:
int[][] a = {{14, 22, 35, 42}, {15, 67, 45}, {16, 34}};  
for (int i = 0; i < a.length; i++) { 
    for (int j = 0; j < a[i].length; j++) { 
        System.out.print(a[i][j] + " ");
    } 
    System.out.println();
}

推荐阅读