在 Java 编程中,数组是用于存储固定大小、相同数据类型元素的容器,是处理批量数据的基础工具。掌握数组的定义方式,是实现数据遍历、排序、查找等操作的前提。Java 定义数组有三种主流方式,每种方式的语法、适用场景不同,下面从概念入手,逐一解析三种定义方式的细节与差异。
一、先明确:Java 数组的核心特性
在学习定义方式前,需先了解数组的两个核心特性,这是理解定义逻辑的基础:
固定大小:数组一旦定义,长度不可修改。例如定义长度为 5 的数组,后续无法扩容为 6,也不能缩减为 4,若需动态调整元素数量,需借助 ArrayList 等集合类;
相同类型:数组中所有元素的数据类型必须一致,不能同时存储 int、String、double 等不同类型的数据(Object 数组除外,可存储所有对象类型,但本质仍遵循 “相同类型” 原则)。
例如,可定义存储 5 个 int 类型整数的数组,或存储 3 个 String 类型字符串的数组,但不能定义同时存储 int 和 String 的数组。
二、Java 定义数组的三种方式:语法、实例与适用场景
Java 数组定义需包含 “数据类型”“数组名”“长度 / 元素初始化” 三个核心要素,三种方式的差异主要体现在 “长度指定时机” 与 “元素初始化方式” 上。
1. 方式一:声明数组时指定长度,后续手动赋值(动态初始化)
这种方式先定义数组的类型和长度,创建空数组,后续通过索引(数组元素的位置编号,从 0 开始)手动为每个元素赋值,适合提前知道数组长度,但暂时不确定元素值的场景。
语法格式
java取消自动换行复制
// 格式1:数据类型[] 数组名 = new 数据类型[数组长度];
// 格式2:数据类型 数组名[] = new 数据类型[数组长度];(不推荐,可读性差)
推荐使用格式 1(数据类型[] 数组名),方括号紧跟数据类型,能清晰体现 “这是一个数组类型”,符合 Java 编码规范。
实例演示
定义一个长度为 3 的 int 类型数组,后续赋值并输出:
java取消自动换行复制
public class ArrayDemo {
public static void main(String[] args) {
// 1. 定义长度为3的int数组,此时数组中元素为默认值(int默认0)
int[] arr = new int[3];
// 2. 通过索引手动赋值(索引0对应第一个元素,索引2对应第三个元素)
arr[0] = 10; // 第一个元素赋值为10
arr[1] = 20; // 第二个元素赋值为20
arr[2] = 30; // 第三个元素赋值为30
// 3. 输出数组元素
System.out.println(arr[0]); // 输出10
System.out.println(arr[1]); // 输出20
System.out.println(arr[2]); // 输出30
}
}
关键说明
默认值规则:数组创建后未赋值时,元素会自动填充默认值 ——int、long 等整数类型默认 0,double、float 等浮点类型默认 0.0,boolean 类型默认 false,引用类型(如 String)默认 null;
长度不可改:上述数组arr的长度为 3,若尝试赋值arr[3] = 40,会抛出ArrayIndexOutOfBoundsException(数组索引越界异常),因为索引最大为 2(长度 - 1);
适用场景:适合已知数据数量,但元素值需通过计算、输入等动态获取的场景,如从键盘输入 3 个学生成绩存入数组。
2. 方式二:声明数组时直接初始化元素(静态初始化,省略 new 关键字)
这种方式不指定数组长度,直接在定义时列出所有元素,数组长度由元素个数自动确定,适合提前知道所有元素值的场景,代码简洁高效。
语法格式
java取消自动换行复制
数据类型[] 数组名 = {元素1, 元素2, 元素3, ...};
实例演示
定义一个存储 3 个 String 类型字符串的数组,直接初始化元素并遍历输出:
java取消自动换行复制
public class ArrayDemo {
public static void main(String[] args) {
// 1. 直接初始化元素,数组长度自动为3(元素个数)
String[] fruits = {"苹果", "香蕉", "橙子"};
// 2. 遍历数组(通过for循环,索引从0到长度-1)
for (int i = 0; i < fruits.length; i++) {
System.out.println("第" + (i+1) + "个水果:" + fruits[i]);
}
}
}
// 输出结果:
// 第1个水果:苹果
// 第2个水果:香蕉
// 第3个水果:橙子
关键说明
长度自动计算:fruits数组因包含 3 个元素,长度自动为 3,可通过数组名.length获取长度(如fruits.length返回 3);
不可拆分声明与初始化:这种方式必须在同一行完成声明与初始化,不能拆分为两行(如String[] fruits; fruits = {"苹果", "香蕉"};会报错),若需拆分,需使用方式三的语法;
适用场景:适合元素值固定的场景,如存储固定的省份名称、课程列表等。
3. 方式三:声明数组时通过 new 关键字初始化元素(静态初始化,显式 new)
这种方式结合了方式一和方式二的特点,通过new 数据类型[]{元素1, 元素2,...}显式创建数组并初始化元素,数组长度同样由元素个数确定,支持拆分声明与初始化,灵活性更高。
语法格式
java取消自动换行复制
// 格式1:同一行完成声明与初始化
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};
// 格式2:拆分声明与初始化(先声明,后初始化)
数据类型[] 数组名;
数组名 = new 数据类型[]{元素1, 元素2, ...};
实例演示
定义一个 double 类型数组,拆分声明与初始化,再通过增强 for 循环输出元素:
java取消自动换行复制
public class ArrayDemo {
public static void main(String[] args) {
// 1. 拆分声明与初始化
double[] scores; // 声明double类型数组
scores = new double[]{95.5, 88.0, 92.5, 76.0}; // 初始化元素,长度自动为4
// 2. 增强for循环遍历(无需关注索引,直接获取每个元素)
System.out.println("学生成绩列表:");
for (double score : scores) {
System.out.println(score);
}
}
}
// 输出结果:
// 学生成绩列表:
// 95.5
// 88.0
// 92.5
// 76.0
关键说明
与方式二的差异:相比方式二({元素1, 元素2}),这种方式显式使用new 数据类型[],支持拆分声明与初始化,适合数组声明与初始化不在同一代码块的场景(如在方法外声明,方法内初始化);
不可指定长度:不能在new 数据类型[]后指定长度(如new double[4]{95.5, 88.0}会报错),因为元素个数已确定长度,指定长度会造成冲突;
适用场景:适合数组声明与初始化分离的场景,如在类的成员变量中声明数组,在构造方法或其他方法中初始化元素。