Java入门基础-04数组
本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记
上一章:Java入门基础-03程序流程控制
目录
一、认识数组
数组是什么?
数组就是一个容器,用来存一批同种类型的数据。
如:
int[ ] arr = {20, 10, 30, 80, 90}
String[ ] names = {“牛二”, “西门”, “李三”}
二、数组的定义和访问
1.静态初始化数组
- 定义数组的时候直接给数组赋值
静态初始化数组的格式:
// 完整格式
// 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3,....};
int[] ages = new int[]{12, 16, 24, 28};
double[] scores = new double[]{78.8, 89.0, 57.2, 95.5};
// 简化格式
// 数据类型[] 数组名 = {元素1, 元素2, 元素3,....};
int[] ages2 = {14, 16, 17, 19};
注意:
- “数据类型[ ] 数组名" 也可以写成”数据类型 数组名[ ]“。 但一般不用这种写法
- 什么类型的数组只能存放什么类型的数据。
数组属于引用数据类型,数组变量名中存储的是数组在内存中的地址信息。
数组的访问
访问数组的元素的格式: 数组名称[ 索引 ]
// 数组的访问
// 格式:数组名称[ 索引 ]
int[] arr = {10, 20, 30};
// 取值
System.out.println(arr[0]);
// 赋值
arr[2] = 45;
System.out.println(arr[2]);
运行结果:
数组的长度属性:length
// 获取数组的长度(就是数组元素的个数)
System.out.println(arr.length);
- 数组的最大索引表示:数组名.length - 1 // 前提:元素个数大于0,否则会报错。
- 如果访问数组时,使用的索引超过了数组的最大索引,执行程序时会出bug,会出现一个索引越界的异常提示。
数组的遍历
- 遍历:就是一个一个数据的访问
- 遍历使用场景:求和,元素搜索,找最大值、最小值等。
// 数组的遍历
int[] arr2 = {30, 20, 40, 49};
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
运行结果:
案例训练
- 数组遍历-求和
需求:某部门5名员工的销售额分别是:16,26,36,6,100,请计算出他们部门的总销售额 。
代码:
// 求和
// 需求:某部门5名员工的销售额分别是:16,26,36,6,100,请计算出他们部门的总销售额 。
// 1. 定义一个数组存储5名员工的销售额
int[] money = {16, 26, 36, 6, 100};
// 索引: 0 1 2 3 4
// 3.定义一个变量用于累加求和
int sum = 0;
// 2. 遍历这个数组的每一个数据
for (int i = 0; i < money.length; i++) {
sum += money[i];
}
System.out.println("部门的总销售额:" + sum);
}
运行结果:
2.动态初始化数组
- 定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组的长度。
- 格式:
数据类型[ ] 数组名 = new 数据类型[长度];
int[ ] arr = new int[3];
赋值:
arr[0] = 12;
温馨提示:
- 静态初始化和动态初始化数组的写法是独立的,不可以混用。
错误示范:
int[ ] arr = new int[3] {20, 30, 40};
动态初始化数组元素默认值规则:
两种数组定义的方法各自适合什么业务场景?
- 动态初始化:适合开始不确定具体元素值,只知道元素个数的业务场景。
- 静态初始化:适合一开始就知道要存入哪些元素值的业务场景。
案例训练
评委打分案例:
需求:某歌唱比赛,需要开发一个系统:可以录入6名评委的打分,录入完毕后立即输出平均分做为选手得分。
代码:
public static void main(String[] args) {
// 需求:某歌唱比赛,需要开发一个系统:可以录入6名评委的打分,录入完毕后立即输出平均分做为选手得分。
// 1.定义一个动态初始化数组,负责后期存储6个评委的打分
double[] scores = new double[6];
Scanner sc = new Scanner(System.in);
// 2.遍历数组中的每个位置,录入评委的分数,存入到数组中去
for (int i = 0; i < scores.length; i++) {
System.out.println("请输入第" + (i + 1) + "个评委的评分:");
double score = sc.nextDouble();
scores[i] = score;
}
// 3.遍历数组的每个元素进行求和
double sum = 0;
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
}
System.out.println("选手最终得分为:" + (sum / scores.length));
}
运行结果:
三.数组在计算机中执行的原理
1. 数组的执行原理,Java程序的执行原理
1、运行一个Java程序,主要看JVM中包含的哪几部分内存区域?
- 方法区
- 栈内存
- 堆内存
2、 简单说说 int a = 20; int[] arr = new int[3]这两行代码的执行原理?
- a是变量,直接放在栈中,a变量中存储的数据就是20这个值。
- new int[3]是创建一个数组对象,会在堆内存中开辟区域存储3个整数。
- arr是变量,在栈中,arr中存储的是数组对象在堆内存中的地址值。
2. 多个变量指向同一个数组的问题
1、多个数组变量,指向同一个数组对象的原因是什么?需要注意什么?
- 多个数组变量中存储的是同一个数组对象的地址。
- 多个变量修改的都是同一个数组对象中的数据。
2、 如果某个数组变量中存储的null,代表什么意思?需要注意什么?
- 代表这个数组变量没有指向数组对象。
- 可以输出这个变量,但是不能用这个数组变量去访问数据或者访问数组长度,会报空指针异常:NullPointerException。
四、专项训练:数组常见案例
数组求最值
需求:求{25, 45, 89, 13, 48, 47} 中最大值
代码:
public static void main(String[] args) {
// 需求:求{25, 45, 89, 13, 48, 47} 中最大值
// 1,创建数组
int[] arr = {25, 45, 89, 13, 48, 47};
// 2.定义一个变量用于最终记住最大值。
int max = arr[0];
// 3. 从数组的第二个位置开始遍历。
for (int i = 0; i < arr.length; i++) {
// 判断一下当前遍历的这个数据,是否大于最大值max存储的数据。
if(arr[i] > max){
max = arr[i];
}
}
System.out.println("最大值为:" + max);
}
运行结果:
求数组中的元素最大值,我们是如何实现的?
- 把数据拿到程序中去,用数组装起来
- 定义一个变量max用于记录最大值,max变量默认存储了第一个元素值作为参照物
- 从第二个位置开始遍历数组的数据,如果当前元素大于变量存储的数据,则替换变量存储的值为该元素
- 循环结束后输出max变量即可
数组反转
需要:某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。[10, 20, 30, 40, 50] 反转后 [50, 40, 30, 20, 10]
代码:
public static void main(String[] args) {
// 1. 准备一个数组
int[] arr = {10, 20, 30, 40, 50};
// 2. 定义一个循环,设计2个变量,一个在前,一个在后
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
// arr[i] arr[j]
// 交换
// 1. 定义一个临时变量记住后一个位置处的值。赋值是从右往左
int temp = arr[j];
// 2. 把前一个位置处的值赋值给后一个位置了
arr[j] = arr[i];
// 3.把临时变量中记住的后一个位置的值赋给前一个位置处
arr[i] = temp;
}
// 3. 遍历数组中的每一个数据,看是否反转成功
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
运行结果:
1. 我们如何完成数组的反转?
- 使用for循环,控制让数组的前后位置的元素,依次交换。
2. 数组如何实现前后元素交换的?
- 定义一个临时变量记住后一个位置处的数组。
- 再把前一个位置处的元素值,赋值给后一个位置处。
- 最后把临时变量记住的后一个位置的值赋给前一个位置处。
随机排名
需求:某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先依次录入5名员工的工号,然后展示出一组随机的排名顺序。
代码:
public static void main(String[] args) {
// 1.定义一个动态初始化的数组用于存储5名员工的工号
int[] codes = new int[5];
// 2. 提示用户录入5名员工的工号
Scanner sc = new Scanner(System.in);
for (int i = 0; i < codes.length; i++) {
System.out.println("请输入第" + (i + 1) + "位员工的工号");
int code = sc.nextInt();
codes[i] = code;
}
// 3. 打乱数组中元素的顺序
Random r = new Random();
for (int i = 0; i < codes.length; i++) {
// 每遍历到一个数据,都随机一个数组索引范围内的值。然后让当前遍历的数据与该索引位置处的值交换
int index = r.nextInt(codes.length); // 0-4
// 定义一个临时变量记住index位置处的值
int temp = codes[index];
// 把i位置处的值赋值给index位置处
codes[index] = codes[i];
// 把temp的值赋值给i位置处
codes[i] = temp;
}
// 4. 遍历数组中的工号输出即可
for (int i = 0; i < codes.length; i++) {
System.out.print(codes[i] + " ");
}
}
运行结果:
我们是如何实现随机排名的?
- 定义一个动态初始化数组用于录入员工的工号。
- 遍历数组中的每一个元素。
- 每遍历到一个数据,都随机一个索引值出来,让当前数据与该索引位置处的数据进行交换。
- 输出数组中的内容即可。
总结:
标签:arr,遍历,Java,入门,int,length,数组,变量 From: https://blog.csdn.net/m0_64126885/article/details/140229417数组到这里就结束啦,本章知识点有:什么是数组;数组的两种定义,静态初始化数组和动态初始化数组,包含数组的访问与遍历;数组在计算机中运行的原理,内存区域有方法区,栈内存,堆内存;案例有求数组的最值,实现数组反转与随机排名。