数组
数组是什么
数组就是一个容器,用来存一批同种类型的数据。
数组有什么用
遇到批量数据的存储和操作时,数组比变量更适合。代码简洁,逻辑清晰。
数组的定义
静态初始化数组
定义数组的时候直接给数组赋值。
格式1(完整格式)
数据类型[] 数组名 = new 数据类型[]{元素1,元素2 ,元素3… };
格式2(简化格式)
数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };
使用场景
适合一开始就知道要存入哪些元素值的业务场景。
动态初始化数组
定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组的长度。
格式
数据类型[] 数组名 = new 数据类型[长度];
使用场景
- 适合开始不确定具体元素值,只知道元素个数的业务场景。
- 先定义数组,后赋值数据进去。
动态初始化数组元素默认值规则
数组的访问
格式
数组名称[索引]
取值
int data = arr[1];
赋值
arr[1] = 1;
数组长度
数组名称.length
- 数组的最大索引是“数组名称.length - 1”(前提:元素个数大于0)
数组的遍历
什么是遍历
就是依次访问数组中的每个元素。
为什么要遍历数组
业务开发中需要用到:统计数据,搜索数据...
如何遍历数组
int[] arr = {1, 2, 3, 4, 5};
for (i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
数组的执行原理
Java的内存分配
Java会在计算机内存中运行一个JVM程序,Java的程序都在JVM中运行,Java将JVM虚拟机的内存分为五部分:
- 方法区:用于存放字节码文件。
- 栈:用于存放运行的方法和变量。
- 堆:用于存放用new关键字创建的对象。
- 本地方法栈
- 寄存器
Java程序的执行原理
- Java程序开始运行后,其class文件会被提取到方法区,然后一行一行地运行class文件。
- 将运行过程中的方法和变量存放在栈中,由new关键字创建的对象被存放在堆中。
- 依次运行直到程序结束。
数组的执行原理
- 当运行到定义数组的代码时,数组变量被存放在栈中,而数组对象被存放在堆中。
- 栈中的数组变量的被赋值为堆中的数组变量的地址。
多个数组变量指向同一个数组对象
- 多个数组变量可以指向同一个数组对象,只要这些数组变量中存储的是同一个数组对象的地址。
- 多个变量修改的都是同一个数组对象中的数据。
- 一旦数组对象中的数据被修改,则所有数组变量访问出的值都会被修改。
空指针
- 如果某个数组变量存储的地址是null,那么该变量将不再指向任何数组对象。
- 此时访问其对象会出现异常。
数组的注意事项
- 什么类型的数组只能存放什么类型的数据。
- “数据类型[] 数组名”也可写成 “数据类型 数组名[] ”。
- 数组变量名中存储的是数组在内存中的地址,数组是一种引用数据类型。
- 数组一旦定义出来,其长度和类型就固定了。
- 不要访问超过数组的最大索引,否则会出现数组访问越界异常。
数组应用案例
数组求最值
需求
找出数组中元素的最大值。
实现步骤
- 把数据输入到数组中。
- 定义一个变量max用于记录最终的最大值。
- 从第二个位置开始遍历数组的数据,如果遍历的当前数据大于max变量存储的数据,则替换变量存储的数据为当前数据。
- 循环结束后输出max变量。
代码
public class MaxOfArray {
public static void main(String[] args) {
int[] arr = {5, 9, 4, 6, 7}; //定义数组
int max = arr[0]; //记录数组的最大值,初始化为数组的第一个元素
//从第二个位置开始遍历数组,并将max与这些元素依次比较,将较大值存入max
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
System.out.println(max); //输出数组元素的最大值
}
}
数组反转
需求
某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。
实现步骤
- 使用for循环,让数组的首尾位置的元素依次交换。
- 定义一个临时变量存储前一个位置处的元素值。
- 再把后一个位置处的元素值,赋值给前一个位置处。
- 最后把临时变量存储的前一个位置的值赋值给后一个位置处。
代码
public class ArrayReverse {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50}; //定义数组
//使用for循环,让数组的首尾位置的元素依次交换。
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i]; //定义一个临时变量存储前一个位置处的元素值
arr[i] = arr[arr.length - 1 - i]; //再把后一个位置处的元素值,赋值给前一个位置处
arr[arr.length - 1 - i] = temp; //最后把临时变量存储的前一个位置的值赋值给后一个位置处
}
//遍历打印数组,查看交换后的数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
随机排名
需求
某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先依次录入5名员工的工号,然后展示出一组随机的排名顺序。
实现步骤
- 定义一个动态初始化的数组用于录入员工的工号。
- 遍历数组中的每个元素。
- 每遍历到一个数据,都随机一个索引值出来,让当前数据与该索引位置处的数据进行交换。
- 输出数组中的内容。
代码
import java.util.Random;
import java.util.Scanner;
public class ArrayShuffle {
public static void main(String[] args) {
int[] workId = new int[5]; //定义一个动态初始化的数组
Scanner sc = new Scanner(System.in); //获取Sacnner对象
Random r = new Random(); //获取Random对象
//循环输入5名员工的工号
for (int i = 0; i < workId.length; i++) {
System.out.println("请输入第" + (i + 1) + "名员工的工号");
workId[i] = sc.nextInt();
}
//遍历数组中的每个元素并随机打乱
for (int i = 0; i < workId.length; i++) {
int index = r.nextInt(5); //随机一个索引值
//让当前数据与该索引位置处的数据进行交换
int temp = workId[i];
workId[i] = workId[index];
workId[index] = temp;
}
//遍历打印数组,查看交换后的数组
for (int i = 0; i < workId.length; i++) {
System.out.println(workId[i]);
}
}
}
补充:Debug工具的使用
Debug工具是什么
Debug工具是IDEA自带的断点调试工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况。
Debug工具的基本使用步骤
- 在需要控制的代码行左侧,点击一下,形成断点。
- 选择使用Debug方式启动程序,启动后程序会在断点处暂停。
- 控制代码一行一行的往下执行,同时可以观察所有变量的值。