目录
1. ArrayIndexOutOfBoundsException
数组就是用来存储一批同种类型数据的内存区域(可以理解成容器)。
一、数组的定义
1. 静态初始化数组
定义数组的时候直接给数组赋值
静态初始化数组的格式:
// 完整格式
数据类型[] 数组名 = 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};
注意:数组变量名中存储的是数组在内存中的地址,数组是引用类型。
1.1 数组的访问
// 数组名称[索引]
int[] arr = {12, 24, 36};
// 取值
System.out.println(arr[0]); // 12
// 赋值
arr[2] = 100;
System.out.println(arr[2]); // 100
// 数组的长度属性:length
// 获取数组的长度(就是数组元素的个数)
System.out.println(arr.length); // 3
数组的最大索引:数组名. length – 1(前提:元素个数大于0)
1.2 数组的几个注意事项
- “数据类型[] 数组名”也可以写成 “数据类型 数组名[] ”
int[] ages =...; int ages[] =...; double[] scores = ...; double scores[] = ...;
- 什么类型的数组存放什么类型的数据,否则报错
- 数组一旦定义出来,程序执行的过程中,长度、类型就固定了
2. 动态初始化数组
定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据
数组的动态初始化格式:
// 数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];
// 后赋值
arr[0] = 10;
System.out.println(arr[0]); // 10
2.1 动态初始化数组的元素默认值
元素默认值规则:
数据类型 | 明细 | 默认值 |
基本类型 | byte、short、char、int、long | 0 |
float、double | 0.0 | 0.0 |
boolean | false | false |
引用类型 | 类、接口、数组、String | null |
3. 两种初始化的的使用场景总结、注意事项说明
- 动态初始化:只指定数组长度,后期赋值,适合开始知道数据的数量,但是不确定具体元素值的业务场景。
- 静态初始化:开始就存入元素值,适合一开始就能确定元素值的业务场景。
- 两种格式的写法是独立的,不可以混用。
二、数组的遍历
遍历:就是一个一个数据的访问。
int[] ages = {20, 30, 40, 50};
for (int i = 0; i < ages.length; i++) {
System.out.println(ages[i]);
}
三、数组的案例
1. 数组元素求和
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];
}
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];
}
}
3. 数组排序
就是对数组中的元素,进行升序(由小到大)或者降序(由大到小)的操作。
3.1 数组排序的技术
- 冒泡排序
- 选择排序
- 快速排序
- 插入排序
3.2 数组搜索相关的技术
- 二分搜索
- 分块查找
- 哈希表查找
四、数组的内存图
1. Java 内存分配介绍
- 栈
- 堆
- 方法区
- 本地方法栈
- 寄存器
2. 数组内存图
public class Test {
public static void main(String[] args) {
int a = 10;
int[] arr = new int[]{11, 22, 33};
arr[0] = 44;
arr[1] = 55;
arr[2] = 66;
System.out.println(arr[0]); //44
System.out.println(arr[1]); //55
System.out.println(arr[2]); //66
}
}
3. 两个变量指向同一个数组
public class Test2{
public static void main(String[] args) {
int[] arr1 = {11, 22, 33};
int[] arr2 = arr1;
System.out.println(arr1);
System.out.println(arr2);
arr2[1] = 99;
System.out.println(arr1[1]);
System.out.println(arr2[1]);
}
}
五、数组使用的常见问题
1. ArrayIndexOutOfBoundsException
如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)
int[] arr = new int[]{11, 22, 33};
System.out.println(arr[2]);
System.out.println(arr[3]) // 出现异常
2. NullPointerException
如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常)
arr = null;
System.out.println(arr); // null
System.out.println(arr.length) // 出现异常
六、Debug工具的使用
IDEA自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况。