[Java 基础]数组

什么是数组?想象一下,你需要存储 5 个学生的考试成绩。你可以声明 5 个不同的 int 变量,但这会显得很笨拙。数组提供了一种更简洁、更有组织的方式来存储和管理这些数据。

数组可以看作是相同类型元素的集合,这些元素在内存中是连续存储的,并且可以通过一个共同的名称(数组名)和一个索引(下标)来访问。

数组的特点

  • 相同类型: 数组中的所有元素必须是相同的数据类型(例如,都是 int、String 或自定义的对象类型)
  • 固定长度: 数组在创建时必须指定其长度,并且一旦创建,其长度通常是不可改变的
  • 连续存储: 数组中的元素在内存中是依次连续存储的,这使得可以通过索引快速访问任何位置的元素
  • 索引访问: 数组中的每个元素都有一个唯一的索引(下标),用于标识其在数组中的位置。索引从 0 开始,到 数组长度 - 1 结束

声明数组只是告诉编译器我们将要创建一个存储特定类型元素的数组,并为其指定一个名称。声明数组的方法:

java 复制代码
int[] scores;         // 声明一个存储整数的数组,名为 scores
String[] names;       // 声明一个存储字符串的数组,名为 names
double[] prices;      // 声明一个存储双精度浮点数的数组,名为 prices

创建数组是指在内存中为数组分配实际的空间,并指定数组的长度(可以存储多少个元素)。我们使用 new 关键字来创建数组:

java 复制代码
数组名 = new 类型[数组长度];
java 复制代码
int[] scores = new int[5];    // 创建一个可以存储 5 个整数的数组
String[] names = new String[10]; // 创建一个可以存储 10 个字符串的数组
double[] prices = new double[100]; // 创建一个可以存储 100 个双精度浮点数的数组

在创建数组时,如果没有显式地给数组元素赋值,它们会被赋予默认值。 我们也可以在创建数组的同时直接初始化数组元素:

java 复制代码
int[] numbers = {10, 20, 30, 40, 50}; // 创建一个包含 5 个整数的数组并赋值
String[] days = {"Monday", "Tuesday", "Wednesday"}; // 创建一个包含 3 个字符串的数组并赋值

:::color3

使用这种方式初始化时,不需要指定数组的长度,编译器会根据提供的元素个数自动确定数组的长度。

:::

当然,你也可以通过先创建再赋值的方式初始化数组:

java 复制代码
int[] grades = new int[3]; // 创建一个长度为 3 的整数数组
grades[0] = 85;           // 给第一个元素(索引为 0)赋值
grades[1] = 92;           // 给第二个元素(索引为 1)赋值
grades[2] = 78;           // 给第三个元素(索引为 2)赋值

创建完数组并向其中放入数据后,如果要访问数组中的特定元素,我们需要使用数组名和元素的索引(下标)。索引从 0 开始。

java 复制代码
int[] ages = {25, 30, 22};

int firstAge = ages[0]; // firstAge 的值为 25
int secondAge = ages[1]; // secondAge 的值为 30
int thirdAge = ages[2];  // thirdAge 的值为 22

System.out.println("第一个年龄是:" + firstAge);
System.out.println("第二个年龄是:" + secondAge);
System.out.println("第三个年龄是:" + thirdAge);

可以使用数组的 length 属性来获取数组的长度(包含的元素个数)。length 是数组的一个只读属性,不能被修改。

java 复制代码
int[] data = {1, 2, 3, 4, 5};
int arrayLength = data.length; // arrayLength 的值为 5
System.out.println("数组的长度是:" + arrayLength);

遍历数组是指访问数组中的每一个元素。常用的遍历方式有以下几种,最常用的就是直接使用 for 循环遍历:

java 复制代码
int[] scores = {90, 85, 95, 88, 92};
for (int i = 0; i < scores.length; i++) {
    System.out.println("第 " + (i + 1) + " 个分数是:" + scores[i]);
}

相比于直接使用 for 循环遍历,更方便的一种方法是使用增强 for 循环遍历数组:

java 复制代码
String[] colors = {"Red", "Green", "Blue"};
for (String color : colors) {
    System.out.println("颜色:" + color);
}

上面的这些例子都是一维的数组,Java 也支持多维数组,最常见的是二维数组。可以将二维数组看作是数组的数组,或者是一个表格。

java 复制代码
int[][] matrix = new int[3][4]; // 创建一个 3 行 4 列的整数二维数组
int[][] numbers2D = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
int element = numbers2D[1][2]; // 访问第二行(索引为 1)第三列(索引为 2)的元素,值为 6
System.out.println("访问的元素是:" + element);

for (int i = 0; i < numbers2D.length; i++) { // 遍历行
    for (int j = 0; j < numbers2D[i].length; j++) { // 遍历列
        System.out.print(numbers2D[i][j] + " ");
    }
    System.out.println(); // 换行
}

虽然数组非常有用,但它也有一些局限性,第一就是它是固定长度的,一旦创建,长度就不能动态改变,如果需要存储的元素数量不确定,或者需要频繁地添加或删除元素,那么使用集合框架(例如 ArrayList)可能更合适;其二就是数组只能存储相同类型的元素。

相关推荐
怀旧,2 分钟前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
大春儿的试验田41 分钟前
Parameter ‘XXX‘ not found. Available parameters are [list, param1]
java
程序员JerrySUN1 小时前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构
2302_809798321 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
网安INF2 小时前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞
一叶知秋哈2 小时前
Java应用Flink CDC监听MySQL数据变动内容输出到控制台
java·mysql·flink
jackson凌2 小时前
【Java学习笔记】SringBuffer类(重点)
java·笔记·学习
sclibingqing2 小时前
SpringBoot项目接口集中测试方法及实现
java·spring boot·后端
程序员JerrySUN2 小时前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
糯米导航2 小时前
Java毕业设计:办公自动化系统的设计与实现
java·开发语言·课程设计