Day04
数组
1、认识数组
-
数组就是一个容器,用来存储相同类型的数据(元素)
-
int[] arr = {20,10,30,20} String[] name = {"小米","小兰","小孩"}
-
为什么有字符串类型的变量,还要数组
- 减少代码,使得代码整洁,清晰
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RdKlond2-1668420496815)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221113110738296.png)]
2、数组的定义和访问
1.静态初始化数组
-
静态初始化数组:就是定义数组的时候直接给数组元素赋值
-
格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...}
简化格式:推荐
数据类型[] 数组名 = {元素1,元素2,...}
-
注意:
- “数据类型[] 数组名” 也可以写成 “数据类型 数组名[]”,但不建议
- 什么类型的数组只能存放什么类型的数据
- 数组既可以存储基本数据类型,也可以存储引用数据类型
-
数组在计算机的基本原理
-
数组变量存储的是数组在内存中的地址,数组是一种引用数据类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vDWvx5Fk-1668420496816)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221113160129649.png)]
-
package com.itheima.define;
public class Demo {
public static void main(String[] args) {
//数组的定义:静态初始化数组
//数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,...}
int[] ages = new int[]{24,25,20,23,27,27};
double[] height = new double[]{165.2,177,160,180,162.3};//为什么可以存储177,160呢?因为自动类型转换
String[] names = new String[]{"就","成都","的"};
// 简化: 数据类型[] 数组名 = {元素1,元素2,元素3,...}
int[] ages1 = {24,25,20,23,27,27};
double[] height2 = {165.2,177,160,180,162.3};
String[] names2 = {"就","成都","的"};
// 1. “数据类型[] 数组名”也可写成 “数据类型 数组名[] ”。
int ages3[] = {22,23,24};//c语言的写法,不建议
// 2. 什么类型的数组只能存放什么类型的数据。
// int[] ages4 = {223,150.3,120};//报错
// 3.数组既可以存储基本数据类型的数据,也可以存储引用数据类型的数据
int[] ages5 = {24,25,20,23,27,27};//基本数据类型
double[] height5 = {165.2,177,160,180,162.3};//基本数据类型
String[] names5 = {"就","成都","的"};//引用数据类型
System.out.println(ages);//[I@776ec8df [:表示数组 ,I:表示数组类型 @776ec8df:地址,十六进制,因为有英文
System.out.println(height); // [D@4eec7777
System.out.println(names);// [Ljava.lang.String;@3b07d329 [:表示数组 ,Ljava.lang.String:表示数组类型 @3b07d329:地址,十六进制,因为有英文
}
}
数组的访问
-
数组的访问
数组名称[索引]
-
数组的长度属性
数组名称.length
-
数组的最大索引
数组名称.length-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQ2vMqDW-1668420496817)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221113160645516.png)]
- 当使用的索引超出数组最大索引时
- 会报AarryIndexOutOfBoundsException,数组索引(下标)越界异常
package com.itheima.define;
public class Demo2 {
public static void main(String[] args) {
//数组的访问
//1.访问数组中的元素
int[] ages = {22, 18, 1, 24, 27, 26};
// 0 1 2 3 4 5
int age = ages[4];
System.out.println(age);
//2.给数组中的元素重新赋值
ages[4] = 100;
System.out.println(ages[4]);
//3.访问数组的长度
System.out.println(ages.length);
//4.访问数组最大索引元素
System.out.println(ages[ages.length - 1]);
//5.报错,如果数组索引超过范围,会报错 :ArrayIndexOutOfBoundsException 数组索引越界异常
System.out.println(ages[ages.length]);
//数组中元素至少有一个
int[] ages2 = {};
System.out.println(ages2.length-1);
}
}
数组的遍历
-
遍历:就是一个一个的访问数据
-
遍历的原因:求和,元素搜索,找最大值,最小值
-
for循环
package com.itheima.define; public class Demo3 { public static void main(String[] args) { //数组元素的遍历 int[] ages = {22, 18, 1, 24, 27, 26}; for (int i = 0; i < ages.length; i++) { System.out.println(ages[i]); } } }
案例训练
- 数组遍历求和
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ahsk8u0k-1668420496818)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221113173913818.png)]
-
分析:
- 把数据放到数组中,使用静态初始化定义数组
- 使用for循环遍历数组元素,在循环外面定义求和变量,在循环内累加起来
package com.itheima.define; public class Test1 { public static void main(String[] args) { //案例:计算销售总额 int[] money = {16, 26, 36, 6, 100}; int num = 0; for (int i = 0; i < money.length; i++) { //快捷键:money.fori num += money[i]; } System.out.println("销售总额为:" + num); } }
2.动态初始化数组
-
数组的动态初始化:
- 定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组长度
-
格式:
数据类型[] 数组名 = new 数据类型[] int[] arr = new int[3]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vr5x7rr5-1668420496819)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114165956146.png)]
-
动态初始化数组的默认值规则:
- byte,short,char,int,long:0
- float,boolean:0.0
- 引用数据类型:null
package com.itheima.define; public class Demo5 { public static void main(String[] args) { //数组的定义:动态初始化数组 //数据类型[] 数组名 = new 数据类型[数组长度] int[] arr = new int[5]; System.out.println(arr[3]);//0 //赋值 arr[3] = 100; System.out.println(arr[3]);//100 //动态初始化数组中的元素为默认值 //byte,short,char,int,long-------------->默认值:0 byte[] arr1 = new byte[3]; System.out.println(arr1[1]);//0 short[] arr2 = new short[3]; System.out.println(arr2[1]);//0 char[] arr3 = new char[3]; System.out.println(arr3[1]*1);//直接输出arr3[1],输出的是0的字符集编码,故*1,进行强制转换,结果为0,说明是0 int[] arr4 = new int[3]; System.out.println(arr4[1]);//0 long[] arr5 = new long[3]; System.out.println(arr5[1]);//0 //float,double -----------------> 0.0 double[] arr6 = new double[3]; System.out.println(arr6[1]);//0.0 //boolean---------->false boolean[] arr7 = new boolean[3]; System.out.println(arr7[1]);//flase //引用数据类型 String ----------> null String[] arr8 = new String[3]; System.out.println(arr8[1]);//null } }
-
静态和动态初始化各自适合什么业务场景
- 动态:不确定具体元素,只知道元素的个数和数据类型
- 静态:知道具体的元素
案例训练
- 案例1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJkGMdJp-1668420496819)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172112541.png)]
package com.itheima.define;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
//案例:计算6位评委打分总和的平均数
double[] scores = new double[6];
Scanner scanner = new Scanner(System.in);
//建议一个for循环做一个事情
for (int i = 0; i < scores.length; i++) {
System.out.println("请输入第" + (i + 1) + "位评委打分");
// double score = scanner.nextDouble();
// scores[i] = score;
scores[i] = scanner.nextDouble();
}
double sum = 0;
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
}
double result = sum / scores.length;
System.out.println("最终结果为:" + result);
}
}
- 案例2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjEQXWY2-1668420496820)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172226793.png)]
package com.itheima.define;
public class Test3 {
public static void main(String[] args) {
// 需求:某班级学生的Java考试成绩是:99, 100, 62, 15, 48, 65, 98, 99, 5, 59.5, 75; 请统计班级总人数和及格学生总人数。
double[] scores = {99, 100, 65, 15, 48, 65, 98, 99, 5, 59.5, 75};
System.out.println("班级总人数:" + scores.length);
int student = 0;
for (int i = 0; i < scores.length; i++) {
if (scores[i] >= 60) {
student++;
}
}
System.out.println("及格学生总人数:" + student);
}
}
3、数组在计算机中的执行机制
1.Java内存分配,数组在内存中的执行原理
- 运行一个Java程序,主要看JVM包含的以下内存区域
- 方法区
- 栈内存(基本数据变量都在栈内存)
- 堆内存
- 简单说说 int a = 20; int[] arr = new int[3]这两行代码的执行原理?
- a是变量,直接放在栈内存,a变量存储的数据就是20这个值
- new出来的数组对象放在堆内存开辟区域存储三个整数,并且有自己的地址信息
- arr是数组变量,直接放在栈内存,内部存储的为数组对象的地址信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TrwT1Enb-1668420496821)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172647506.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPA3Z7Y5-1668420496821)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172706897.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zhWU29q-1668420496822)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172735625.png)]
多个变量指向同一个数组的问题
- 多个变量指向同一个数组对象,它们内部存储的地址信息是一样的,
- 多个变量修改的是同一个数组对象中的变量,当其中一个变量对数组进行操作改变数组元素,会影响其他变量
- 如果变量里的存储的是null,那么就不再指向任何对象,此时打印数组名结果是:null,打印数组元素以及数组长度会报空指针异常:NullPonitException
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dPLARfQ4-1668420496823)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174057347.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iEO4OSkW-1668420496823)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174124868.png)]
4、专项训练:数组常见的案例
1.求数组中的最大值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZzDVI35-1668420496823)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174302370.png)]
package com.itheima.Demo;
public class Test1 {
public static void main(String[] args) {
//求数组中元素的最大值
//1.将数据放入到数组中
int[] faceScore = {15,9000,10000,20000,9500,-5};
//2.设置一个临时最大值,默认使用数据第一个元素 ,如果用0的话,数组中有负数将不正确
int max = faceScore[0];
//3.遍历,比较,遍历出的数据,如果大于临时最大值,就替换
for (int i = 1; i < faceScore.length; i++) {//int i = 1,没有必要第一个元素与自己再比一次
if (faceScore[i]>max){
max = faceScore[i];
}
}
System.out.println("最大结果:"+max);
}
}
2.数组反转
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gC8w3Jpi-1668420496824)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174450300.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjeziKUp-1668420496824)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174514452.png)]
package com.itheima.Demo;
public class Test2 {
public static void main(String[] args) {
//案例:某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。
// [10, 20, 30, 40, 50] 反转后 [50, 40, 30, 20, 10]
//1.定义数组
int[] arr = {10,20,30,40,50};
// 10 20 30 40 50
// 0 1 2 3 4
// i j
//arr[0]与arr[4]交换,arr[1]与arr[3]交换,arr[2]不动
//for循环,定义两个初始值变量,让两个变量代表的元素交换,首先是0,4
for (int i = 0 , j = arr.length-1; i < j ; i++,j--) {//循环条件:当arr[i]与arr[j]相遇交换结束,相遇时又不用进行交换,因此i<j
//留着交换需要定义一个临时变量
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}
}
随机排名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIBgXN1F-1668420496825)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174644732.png)]
package com.itheima.Demo;
import java.util.Random;
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
//需求
//某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。
//定义动态数组
int[] arr = new int[5];
//将动态数组的每个位置元素录入
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第"+(i+1)+"名开发人员");
arr[i] = scanner.nextInt();
}
//遍历数组,随机拿到索引与之交换
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int index = r.nextInt(arr.length);//我们需要随机的索引范围为[0,4],故这里写5也就是数组长度
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
System.out.println("随机排名后的顺序:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}
}
5、Debug工具的使用
}
//遍历数组,随机拿到索引与之交换
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int index = r.nextInt(arr.length);//我们需要随机的索引范围为[0,4],故这里写5也就是数组长度
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
System.out.println("随机排名后的顺序:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}
}
### 5、Debug工具的使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98XSUI6d-1668420496825)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114180747128.png)]