目录
一、数组的定义
1. 静态初始化数组
1.1 数组的访问
1.2 数组的几个注意事项
2. 动态初始化数组
2.1 动态初始化数组的元素默认值
3. 两种初始化的的使用场景总结、注意事项说明
二、数组的遍历
三、数组的案例
1. 数组元素求和
2. 数组求最值
3. 数组排序
3.1 数组排序的技术
3.2 数组搜索相关的技术
四、数组的内存图
1. Java 内存分配介绍
2. 数组内存图
3. 两个变量指向同一个数组
五、数组使用的常见问题
1. ArrayIndexOutOfBoundsException
2. NullPointerException
六、Debug工具的使用
数组就是用来存储一批同种类型数据的内存区域(可以理解成容器)。
一、数组的定义
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自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况。