目录
活动地址:CSDN21天学习挑战赛
数组是什么
数组就是用来存储一批同种类型数据的内存区域(可以理解成容器)。
数组的静态初始化
定义数组的时候直接给数组赋值。
// 完整格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2 ,元素3… };
double[] scores = new double[]{89.9, 99.5, 59.5, 88.0};
int[] ages = new int[]{12, 24, 36} // 后面以此为例
// 简化格式
数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };
int[] ages = {12, 24, 36};
注意:数组变量名中存储的是数组在内存中的地址,数组是引用类型。
数组的访问
// 格式
数组名称[索引]
// 取值
System.out.println(ages[0]); // 12
// 赋值
ages[2] = 100;
System.out.println(ages[2]); // 100
数组的长度属性:length
// 获取数组的长度(就是数组元素的个数)
System.out.println(ages.length); // 3
数组的最大索引可以怎么表示?
数组名. length – 1 (前提:元素个数大于0)
// 获取数组的最大索引(就是数组最后一个元素的下标)
// 前提:元素个数大于0
System.out.println(ages.length - 1); // 2
数组的几个注意事项
“数据类型[] 数组名”也可以写成 “数据类型 数组名[] ”。
int[] ages =...;
int ages[] =...;
double[] scores = ...;
double scores[] = ...;
什么类型的数组存放什么类型的数据,否则报错。
// 这个是错的
int[] arrs = new int[]{30, 40, "helloworld"};
数组一旦定义出来,程序执行的过程中,长度、类型就固定了。
数组的动态初始化
定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据。
数组的动态初始化格式
数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];
// 后赋值
arr[0] = 10;
System.out.println(arr[0]); // 10
两种初始化的的使用场景总结、注意事项说明
动态初始化:只指定数组长度,后期赋值,适合开始知道数据的数量,但是不确定具体元素值的业务场景。
静态初始化:开始就存入元素值,适合一开始就能确定元素值的业务场景。
两种格式的写法是独立的,不可以混用。
元素默认值规则
数据类型 | 明细 | 默认值 |
基本类型 | byte、short、char、int、long | 0 |
float、double | 0.0 | |
boolean | FALSE | |
引用类型 | 类、接口、数组、String | null |
数组遍历
遍历:就是一个一个数据的访问。搜索、数据统计等等都需要用到遍历。
int[] ages = {20, 30, 40, 50};
for (int i = 0; i < ages.length; i++) {
System.out.println(ages[i]);
}
数组遍历的应用
1)数组求和
// 这5个数据的数组
int[] money = {16, 26, 36, 6, 100};
// 定义一个变量,记录求和
int sum = 0;
// 遍历数组中的每个数据,然后在外面定义求和变量把他们累加起来。
for (int i = 0; i < money.length; i++) {
// i = 0 1 2 3 4
sum += money[i];
}
// 循环结束后输出求和
return sum;
2)数组求最值
// 把颜值数据拿到程序中去,用数组装起来。
int[] faceScores = {15, 9000, 10000, 20000, 9500, -5};
// 定义一个变量用于记录最大值,这个变量建议默认存储第一个元素值作为参照。
int max = faceScores[0];
// 遍历数组的元素,如果该元素大于变量存储的元素,则替换变量存储的值为该元素。
for (int i = 1; i < faceScores.length; i++) {
if(faceScores[i] > max) {
// 替换
max = faceScores[i];
}
}
// 循环结束后输出最大值
return max;
数组排序
就是对数组中的元素,进行升序(由小到大)或者降序(由大到小)的操作。
数组排序的方法
冒泡排序:每次从数组中找出最大值放在数组的后面去。从头开始两两比较,把较大的元素与较小的元素进行交换,每轮把当前最大的一个元素存入到数组当前的末尾。
实现冒泡排序的关键步骤分析:确定总共需要做几轮: 数组的长度-1.
每轮比较几次:次数规律: 数组的长度 - i
i(轮数) | 次数 |
1 | 3 |
2 | 2 |
3 | 1 |
当前位置大于后一个位置则交换数据
选择排序
快速排序
插入排序
数组搜索相关的技术
二分搜索
分块查找
哈希表查找
数组使用常见问题
问题1:如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)
int[] arr = new int[]{11, 22, 33};
System.out.println(arr[2]);
// System.out.println(arr[3]) // 出现异常
// 出现ArrayIndexOutOfBoundsException异常
问题2:如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常)
arr = null;
System.out.println(arr); // null
// System.out.println(arr.length) // 出现异常
// 出现NullPointerException异常