当我们要存储一个数据的时候,只需要用"数据类型 变量名"定义一个变量就行了,如果要存放多个同类的数据,是不是要一个个地定义变量?比如:
int a1 = 1; int a2 = 2; int a3 = 3; ...
这样定义十分麻烦,于是就有了数组的概念,数组可以存放多个相同类型的数据。
数组的定义及初始化Java定义和初始化数组的方式和C语言是有区别的,在C语言我们是用数据类型 数组名[数组长度]来定义的,但在Java是不允许直接在定义数组时就定义长度的。
int arr1[]; //正确,编译会通过 int arr1[5]; //错误,不能在定义数组时定义长度
那么,如何完成定义+初始化的操作呢,Java给出两套方案(含适用场景)
1.静态初始化数据类型 数组名[] = new 数据类型[] {常量1, 常量2, ···};
其中,new 数据类型[]可省略,对于此类数组,会根据常量的个数确定数组长度
适用场景:已知一连串数据的值
2. 动态初始化数据类型 数组名[] = new 数据类型[数组长度];
例如
int arr[] = new int[5] //定义一个长度为5的整型数组
对于基本数据类型,动态初始化的数组,默认为其所有元素初始化值为0
适用场景:一串数据不知道它的值,但已知这串数据的个数(即要定义数组的长度)
数组元素访问访问数组元素需要用 数组名[索引]
索引就是数组每个元素的标号,在数组中索引是连续的,最小值0,最大值是 数组长度 - 1
访问数组元素时不可以越界,否则会出现异常
int arr[] = {1, 2, 3, 4, 5};
System.out.println(a[4]); //没问题
System.out.println(a[5]); //不允许,会出现数组越界的异常
应用实例
案例:
需求:已知9个人的Java成绩依次是87, 90, 73, 52, 99, 67, 83, 92, 96。
现在要求打印他们的平均分(保留1位小数)。
public class E {
public static void main(String[] args) {
//已知9个人的Java成绩可以直接用静态初始化定义一个数组来存放
int arr[] = {87, 90, 73, 52, 99, 67, 83, 92, 96};
//定义一个浮点型变量存放平均分,可先用来暂存9个人成绩的总和
double avg = 0;
//遍历数组,将每个人的成绩加到avg中先计算总和
for (int i = 0; i < arr.length; i++) {
avg += arr[i];
}
//此时avg存储的是9个人成绩之和,只需将其除以9即可得到
//整数相除只会得到整数,在被除数位置 * 1.0即可得到浮点数
avg = 1.0 * avg / arr.length;
//最后将平均分打印输出
System.out.printf("%.1f",avg);
}
}
案例2:
已知一串数据
72, 89, 65, 58, 87, 91, 53, 82, 71, 93, 76, 68
要求输出最大值、最小值,以及它们的位置
public class E {
public static void main(String[] args) {
int arr[] = {72, 89, 65, 58, 87, 91, 53, 82, 71, 93, 76, 68};
//全局分析:两次遍历数组,第一次揪出数组元素最大值和最小值,第二次将已存储的最值与数组元素匹配,匹配时就将对应下标打印
//定义变量存放最值,默认值是第一个元素
int min = arr[0];
int max = arr[0];
//从第2元素开始遍历数组,将每个元素和已存储的最值进行比较,选出最大值最小值
for (int i = 1; i < arr.length; i++) {
//判定条件:有元素比已经存储的最小值小,这个元素的值成为新的最小值
if (min > arr[i]) {
min = arr[i];
} else if (max < arr[i]) {
max = arr[i];
}
}
System.out.println("最大值:" + max);
System.out.println("最小值:" + min);
//再次遍历数组,找出最值下标打印输出
for (int i = 0; i < arr.length; i++) {
if (max == arr[i]) {
System.out.println("最大值的下标:" + i);
} else if (min == arr[i]) {
System.out.println("最小值的下标:" + i);
}
}
}
}



