12-数组

nobility 发布于 2025-07-15 01-Java语言基础 1412 次阅读


数组

什么是数组

数组(Array)是用来存储固定长度的同数据类型的元素容器,在 Java 中是一种引用类型。

Java 中数组的特点:

  • 数组中元素类型都相同。
  • 数组一旦被创建,长度就不可改变。
  • 数组中的每个元素都可以通过索引随机访问,索引从 0 开始递增。
  • 数组中的元素都有默认的初始化值,整型是 0,浮点型是 0.0,布尔型是 false,字符型是 '\u0000',引用类型是 null

声明数组

// 官方推荐写法
数据类型[] 数组名;
// 兼容 C 语言的风格(不推荐)
数据类型 数组名[];

示例

int[] scores;

String names[];

初始化数组

静态初始化

声明时指定内容,编译器自动推断数组长度。

// 标准格式
数据类型[] 数组名 = new 数据类型[]{数组元素列表};
// 省略格式
数据类型[] 数组名 = {数组元素列表};

示例

int[] scores = new int[] {10, 20, 30};
// 等价于
int[] scores = {10, 20, 30};

// 省略格式不允许分开写
int[] scores;
scores = {1,2,3}; // 编译错误

动态初始化

声明时指定长度,之后再填充内容。

// 先声明,后创建
数据类型[] 数组名;
数组名 = new 数据类型[数组长度]
// 声明时就分配空间
数据类型 数组名 = new 数据类型[数组长度]

示例

int[] scores;
scores = new int[5];

String[] names = new String[5];

🔔 提示:

未填充内容时,数组中元素是默认初始化值,整型是 0,浮点型是 0.0,布尔型是 false,字符型是 '\u0000',引用类型是 null

操作数组

访问元素

// 读取第一个元素
int first = scores[0];
// 修改第二个元素
scores[1] = 88;

📝 注意:

如果访问数组的索引超过数组范围,就会抛出 ArrayIndexOutOfBoundsException

遍历数组

// 经典 for 循环,可读可写
for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}

// 增强 for-each,只能读不能写
for (int s : scores) {
    System.out.println(s);
}

多维数组

多维数组本质是“数组的数组”,即数组中包含数组。

  1. 多维数组每行的列数可以不同。
    int matrix[][] = new int[3][3];
    // 可以省略列数
    int matrix[][] = new int[3][];
    // 但是不可以省略行数
    int matrix[][] = new int[][3]; // 编译错误
    
    int[][] matrix = new int[][] {{1}, {1, 2, 3}, {1, 2}};
    // 等价于
    int[][] matrix = {{1}, {1, 2, 3}, {1, 2}};
    // 静态初始化时不能指定行数或列数
    int[][] matrix = new int[3][] {{1}, {1, 2, 3}, {1, 2}}; // 编译错误
    int[][] matrix = new int[3][3] {{1, 2, 3}, {1, 2, 3}, {1, 2, 3}}; // 编译错误
    
  2. 当多维数组未显式初始化时,其所有元素都是 null
    int[][] matrix = new int[3][];
    System.out.println(matrix[0]); // 输出 null
    

操作多维数组

访问多维数组元素

// 读取第 2 行第 3 列的元素
int value = matrix[1][2];
// 修改第 1 行第 2 列元素
matrix[0][1] = 10;

遍历多维数组

// 经典 for 循环,可读可写
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

// 增强 for-each,只能读不能写
for (int[] row : matrix) {
    for (int cell : row) {
        System.out.print(cell + " ");
    }
    System.out.println();
}

多维数组的内存结构

Java 中多维数组的内存结构与 C 语言、Go 语言等的连续内存布不同,Java 中多维数组的元素实际上存储的是数组的引用,所以多维数组的行间地址是无序的,而且每行的列数也可以不同

内存结构

matrix[3][]
├── matrix[0] {1, 2, 3}
├── matrix[0] {4, 5, 6, 7}
└── matrix[0] {8, 9}
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2025-07-15