数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。
初始化: 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。
语法:
// 只定义数组长度
数据类型[] 数组名 = new 数据类型[数组长度]; // int[] arr = new int[5];
// 定义时直接给出数组元素
数据类型[] 数组名 = new 数据类型[] {元素1, 元素2, ··· , 元素n}; // int[] arr = new int[] {1, 2, 3, 4, 5};
数据类型[] 数组名 = {元素1, 元素2, ··· , 元素n}; // int[] arr = {1, 2, 3, 4, 5};
注意: 数组名中存储的是数组的地址并不是数组本身,直接打印会打印出数组的哈希地址值
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr);
}
}
数组元素的数据类型决定了数组的数据类型,数组中只能存在同一种数据类型的元素
初始化赋值:
int[] arr = {1, 2, 3, 4, 5}
逐一赋值:
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
注意: 数组的第一个元素是由 0 开始的
拓展: 一旦为数组的每个数组元素分配了内存空间,每个内存空间里存储的内容就是该数组元素的值,即使这个内存空间存储的句容是空,这个空也是一个值(null)。不管以哪种方式来初始化数组,只要为数组元素分配了内存空间,数组元素就具有了初始值。故不能只分配内存空问,不赋初始值。
数组的取值直接使用 数组名[index] 取值
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[0]); // 1
初始化数组时会在内存中分配内存空间,内存空间的大小决定了一维数组能够存储多少个元素,也就是数组长度。如果不知道数组的长度,可以使用数组对象自带的 length 属性获取
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr.length); // 5
分析: 遍历数组需要逐一将元素从数组中取出来。
int[] arr = {1, 2, 3, 4, 5};
int a = arr[0]; //index = 0; a = 1
int b = arr[1]; //index = 1; b = 2
int c = arr[2]; //index = 2; c = 3
int d = arr[3]; //index = 3; d = 4
int e = arr[4]; //index = 4; e = 5
通过上面可以知道,将数组逐一取出只需要将 index++ 即可。 故可以通过循环来实现数组的遍历
实现:
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
// 数组的最小索引为 0,最大索引为 arr.length - 1
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
分析: 假设第 0 号元素是最值 将数组中其他元素注意拿出来与第 0 号元素进行比较。 若其他元素大于/小于当前最值,则覆盖当前最值。
实现:
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int max = arr[0]; //假设 arr[0] 是最大值
int min = arr[0]; //假设 arr[0] 是最小值
//遍历数组
for (int i = 0; i < arr.length; i++) {
//若数组元素大于 max 则替换 max
if (max < arr[i]) {
max = arr[i];
}
//若数组元素小于 min 则替换 min
if (min > arr[i]) {
min = arr[i];
}
}
System.out.println("最大值为:" + max + "最小值为:" + min);
}
}
分析: 将第 0 号元素与第 length - 1 号元素对换。 将第 1 号元素与第 length - 2 号元素对换。 ··· 将第 m 号元素与第 n 号元素对换。 直到所有元素对换完毕,即:m > length / 2 或 m > n
实现:
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int temp; //声明一个临时变量
for (int i = 0; i < arr.length / 2; i++) {
//进行交换操作
temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}
}
}
若将一维数组理解为一层房间,那么二维数组就可以理解为整栋楼的房间。二维数组的每一个元素都是一个一维数组。
// 可以省略 列,不能省略 行
int[][] arr = new int[2][3];
// 定义时直接给出数组元素
int[][] arr = new int[][] {{1, 2}, {3, 4}, {5, 6}};
int[][] arr = {{1, 2}, {3, 4}, {5, 6}};
左行右列
初始化时只给定行,不给定列时可以创建不规则数组
int[][] arr = new arr[3][];
arr[0] = {1, 2, 3}; // 第一行分配 3 个
arr[1] = {5, 6} // 第二行分配 2 个
arr[2] = {4, 7, 8, 9} // 第三行分配 4 个
见名知义,就是索引超过了数组所规定的界限(即超出了数组索引的最大范围)
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[5]); //当前索引最大值为 4 ,却要打印索引为 5 的元素。
}
}
空指针异常就是数组名并没有指向一个地址
public class Test {
public static void main(String[] args) {
int[] arr = null; //定义一个数组,地址值为空
System.out.println(arr[0]); //当前数组名并没有指向一个数组空间,却要打印一个不存在的元素
}
}