Java 零基础教程

Java 数组基础

数组(Arrays)用于存储同一种数据类型的元素集合。理解如何声明和初始化数组,是高效管理和操作数据的关键。数组提供了一种结构化的方式来组织数据,使你能够只用一个变量名,就能对多个数值进行批量操作。

本章将全面覆盖数组声明的语法、不同的初始化方法,以及如何初步操作数组中的元素。

1. 声明数组 (Declaring Arrays)

在 Java 中,声明数组需要指定数组将要存放的元素类型以及数组变量的名称
请注意:声明数组这个动作并没有真正在内存中创建数组,它仅仅是告诉编译器:“嘿,这个变量以后会用来存放某种特定类型的数组”。

1.1 数组声明语法

在 Java 中声明数组的通用语法如下:

数据类型[] 数组名; // 推荐写法
// 或者
数据类型 数组名[]; // 也是合法的,但不太常用
  • 数据类型 (dataType): 指定数组将要存储的元素类型(例如 intStringdouble 或任何其他有效的 Java 类型)。
  • []: 中括号代表这个变量是一个数组。
  • 数组名 (arrayName): 你为这个数组变量起的名称。

示例:

int[] numbers;         // 声明一个整数类型的数组
String[] names;       // 声明一个字符串类型的数组
double[] prices;       // 声明一个双精度浮点数类型的数组
boolean[] flags;       // 声明一个布尔类型的数组

在这些例子中,numbersnamespricesflags 都是数组变量。在这个阶段,系统还没有为它们分配任何内存空间来存储元素。这些声明仅仅定义了每个变量将来会引用的数组类型。

2. 初始化数组 (Initializing Arrays)

声明数组后,你必须对其进行初始化,以便为它分配内存空间并为它的元素赋予初始值。Java 中有几种初始化数组的方法。

2.1 使用 new 关键字初始化

这是最常见的初始化方式。new 关键字会在内存中为数组开辟空间。

语法:

数组名 = new 数据类型[数组长度];
  • 数组名 (arrayName): 数组变量的名称。
  • new: 用于分配内存的关键字。
  • 数据类型 (dataType): 数组存储的元素类型。
  • 数组长度 (arraySize): 数组可以容纳的元素个数。它必须是一个非负整数。

示例:

int[] numbers = new int[5]; // 创建一个可以容纳 5 个整数的数组

在这个例子中,创建了一个名为 numbers 的数组,容量为 5。默认情况下,数组的每个元素都会被初始化为其数据类型的默认值。对于 int 类型,默认值是 0

详细解释:

  • int[] numbers: 声明一个名为 numbers 的整数数组变量。
  • new int[5]: 在内存中分配 5 个整数的空间。每个元素初始化为 0。
  • =: 将新创建的数组的内存地址(引用)赋值给 numbers 变量。

3. 数组的默认值 (Default Values)

当你使用 new 关键字初始化数组时,Java 会根据元素的数据类型自动为其赋予默认值:

  • int, short, byte, long: 0
  • float: 0.0f
  • double: 0.0d
  • boolean: false
  • char: \u0000 (空字符)
  • 对象引用 (例如 String): null

演示默认值的示例代码:

public class DefaultValues {
    public static void main(String[] args) {
        int[] intArray = new int[3];
        double[] doubleArray = new double[3];
        boolean[] booleanArray = new boolean[3];
        String[] stringArray = new String[3];

        System.out.println("整数数组默认值:");
        for (int i = 0; i < intArray.length; i++) {
            System.out.println("intArray[" + i + "] = " + intArray[i]);
        }

        System.out.println("\n双精度浮点数数组默认值:");
        for (int i = 0; i < doubleArray.length; i++) {
            System.out.println("doubleArray[" + i + "] = " + doubleArray[i]);
        }

        System.out.println("\n布尔数组默认值:");
        for (int i = 0; i < booleanArray.length; i++) {
            System.out.println("booleanArray[" + i + "] = " + booleanArray[i]);
        }

        System.out.println("\n字符串数组默认值:");
        for (int i = 0; i < stringArray.length; i++) {
            System.out.println("stringArray[" + i + "] = " + stringArray[i]);
        }
    }
}

输出结果:

整数数组默认值:
intArray[0] = 0
intArray[1] = 0
intArray[2] = 0

双精度浮点数数组默认值:
doubleArray[0] = 0.0
doubleArray[1] = 0.0
doubleArray[2] = 0.0

布尔数组默认值:
booleanArray[0] = false
booleanArray[1] = false
booleanArray[2] = false

字符串数组默认值:
stringArray[0] = null
stringArray[1] = null
stringArray[2] = null

4. 使用数组字面量初始化 (Array Literals)

数组字面量(Array Literals)提供了一种非常简洁的方式,可以在一条语句中完成数组的声明、初始化和赋值。当你在声明时就已经知道要存入数组的具体数值时,这种方法特别好用。

4.1 数组字面量语法

数据类型[] 数组名 = {值1, 值2, 值3, ...};
  • {值1, 值2, ...}: 将一系列值用逗号分隔,并用大括号 {} 括起来。数组的长度会由你提供的值的数量自动决定。

示例:

int[] numbers = {1, 2, 3, 4, 5}; // 创建一个包含 5 个指定整数的数组
String[] names = {"Alice", "Bob", "Charlie"}; // 创建一个包含 3 个字符串的数组

4.2 组合声明与初始化

使用数组字面量时,你可以将声明和初始化完美结合在同一行:

int[] numbers = {1, 2, 3, 4, 5};

这在底层等价于:

int[] numbers;
numbers = new int[]{1, 2, 3, 4, 5};

注意一个常见的错误:不能将简写的字面量赋值拆分到声明之后。下面这种写法会导致编译错误:

int[] numbers;
numbers = {1, 2, 3, 4, 5}; // 编译错误!

如果拆分开写,Java 强制要求你在赋值时使用 new 关键字(如上面的 new int[]{...})。

5. 逐个初始化数组元素

你也可以通过数组的索引(Index)来单独访问并初始化每一个元素。
重点: 数组的索引从 0 开始,一直到 数组长度 - 1 结束。

5.1 单个元素初始化语法

数组名[索引] = 值;

示例:

int[] numbers = new int[5]; // 创建一个长度为 5 的数组,默认全为 0

numbers[0] = 10; // 给第一个元素(索引 0)赋值 10
numbers[1] = 20; // 给第二个元素(索引 1)赋值 20
numbers[2] = 30; // 给第三个元素(索引 2)赋值 30
numbers[3] = 40; // 给第四个元素(索引 3)赋值 40
numbers[4] = 50; // 给第五个元素(索引 4)赋值 50

5.2 严重警告:数组越界异常

如果你试图访问一个不存在的索引(即索引小于 0,或者大于等于数组的长度),程序在运行时就会抛出 ArrayIndexOutOfBoundsException(数组索引越界异常),并导致程序崩溃。

错误示例:

int[] numbers = new int[5]; // 有效索引是 0, 1, 2, 3, 4
numbers[5] = 60; // 崩溃!抛出 ArrayIndexOutOfBoundsException

6. 综合实战演练

让我们来看几个实际的代码例子,巩固声明和初始化数组的知识。

6.1 示例 1:存储学生成绩

假设你想将 5 个学生的成绩存储在一个数组中。你可以声明并初始化一个整数数组。

public class StudentGrades {
    public static void main(String[] args) {
        // 声明并初始化一个数组来存储学生成绩
        int[] grades = new int[5];
        
        // 为每个学生分配成绩
        grades[0] = 85;
        grades[1] = 90;
        grades[2] = 78;
        grades[3] = 92;
        grades[4] = 88;
        
        // 打印每个学生的成绩
        System.out.println("学生成绩列表:");
        for (int i = 0; i < grades.length; i++) {
            System.out.println("学生 " + (i + 1) + ": " + grades[i]);
        }
    }
}

6.2 示例 2:存储一周的日子

你可以使用字符串数组结合数组字面量来存储星期几的名称。

public class Weekdays {
    public static void main(String[] args) {
        // 使用数组字面量声明并初始化字符串数组
        String[] weekdays = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
        
        // 打印日子名称
        System.out.println("一周的日子:");
        for (int i = 0; i < weekdays.length; i++) {
            System.out.println(weekdays[i]);
        }
    }
}

6.3 示例 3:计算数组元素的总和

这个例子演示了如何将数组里面的整数加起来。

public class ArraySum {
    public static void main(String[] args) {
        // 声明并初始化一个整数数组
        int[] numbers = {1, 2, 3, 4, 5};
        
        // 计算数组元素的总和
        int sum = 0;
        for (int i = 0; i < numbers.length; i++) {
            sum += numbers[i];
        }
        
        // 打印总和
        System.out.println("数组元素的总和: " + sum);
    }
}