数组(Array)是一种数据结构,用来存储同一类型值的集合,适用于集中管理类型相同、用途相近的多个数据。我们可以通过一个整型下标访问数组中每一个值。例如:使用数组存储所有员工信息,如果 employees 就是一个员工数组,employees[i] 就是获取数组中下标为 i 的员工信息。
如果有一个拥有5个元素的数组 a,数组结构如下图:
如果我们需要访问某个员工,方式如下:
a[0] = 员工1
a[1] = 员工2
a[2] = 员工3
a[3] = 员工4
a[4] = 员工5
注意:数组下标从 0 开始。上图仅仅为了说明数组,实际上数组中存储的是员工对象的堆栈地址。
声明数组变量需要使用[]符号,语法如下:
<数据类型>[] <变量名>; 或者 <数据类型> <变量名>[];
上面“数据类型”可以是基础类型和引用类型。例如:
int[] a; int a[]; Integer[] a;
上面仅仅声明了数组变量 a,没有对变量 a 进行初始化操作。可以使用 new 运算符去创建一个数组,例如:
int[] a = new int[10];
上面语句创建了一个可以存储10个整数的数组。数组长度可以是常量、变量。例如:
int len = 10; int[] a = new int[len]; int[] a = new int[10];
注意:
数组一旦创建,则不能修改它的大小。
数组创建后系统会默认进行初始化。如果是数字类型,则默认初始化为0。如果是 boolean 类型数组,则默认初始化为 false。如果是引用类型数组,则默认初始化为 null。
如果只是声明了一个数组变量,系统仅给系统分配引用空间,并没有创建对象,也不会为数组分配空间。
声明数组类型变量时不允许指定数组长度,例如:int[3] a; 这是非法语句
上面介绍了创建数组后,系统会默认进行初始化。但是,有时我们可能需要进行手动进行初始化。例如:我们创建了一个 String 数组,默认引用类型数组的元素会初始化为null,我们希望初始化为空字符串(""),操作如下:
import java.util.Arrays; public class Demo { public static void main(String[] args) { String[] strs = new String[10]; // 方式一 for(int i = 0 ; i < strs.length; i++) { strs[i] = ""; } // 方式二 Arrays.fill(strs, ""); } }
注意,初始化数组时下标范围为 0 ~ (数组长度-1),上面的 strs 数组的范围 0 ~ 9,如果使用 strs[10] = ""; 语句初始化数组元素,会抛出如下错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
这是因为数组下标越界了。
如果你觉得使用上面方式初始化数组太繁琐,Java 提供了静态初始化方式,用法如下:
String[] strs = {"", "", "", "", "", "", "", "", "", ""};
使用上面方式初始化时,数组长度为花括号中元素的个数。也可以写成:
String[] strs = new String[]{"", "", "", "", "", "", "", "", "", ""}; // 非法的 String[] strs = new String[10]{"", "", "", "", "", "", "", "", "", ""}; // 非法的 String[] strs; strs = new String[]{"", "", "", "", "", "", "", "", "", ""};
遍历数组可以通过 for 语句和 for-each 语句进行遍历。例如:
(1)使用 for 语句遍历数组
public class Demo { public static void main(String[] args) { String[] strs = new String[5]; // 初始化数组 for(int i = 0; i < strs.length; i++) { strs[i] = String.valueOf(i + 1); } // 遍历数组 for(int i = 0; i < strs.length; i++) { System.out.printf("a[%d]=%s\n", i, strs[i]); } } }
运行示例,输出结果如下:
a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5
(2)使用 for-each 遍历数组
public class Demo { public static void main(String[] args) { String[] strs = new String[5]; // 初始化数组 for(int i = 0; i < strs.length; i++) { strs[i] = String.valueOf(i + 1); } // 遍历数组 for(String str : strs) { System.out.println(str); } } }
运行示例,输出结果如下:
1 2 3 4 5
注意:如果在循环体中需要操作数组下标,推荐使用 for 循环。