数组
定义: 用来存储一批同种类型数据的内存区域(理解为容器)
第一章:数组的定义
-
静态初始化数组
-
定义数组的时候直接给数组赋值
-
格式
// 完整格式 数据类型[] 数组名 = new 数据类型[] {元素1,元素2,元素3...}; // eg: double[] scores = new double[];{89.0,99.5,59.5,34.89}; int [] ages = new int[]{12,24,36}; // 简写 数据类型[] 变量名 ={,,,,} int[] score ={23,56,76,45};
-
数组名称[索引](数组的访问)索引地址从0开始
//赋值 arr[2]=36(原) 赋值:数组名称[索引] = 数据 arr[2] = 100; System.out.println(arr[2]); // 100
-
数组的最大索引表示?
- 数组名.length - 1// 元素个数大于0
-
注意事项:
-
-
动态初始化数组:只确定元素的类型和数组的长度,之后在存入具体数据。
-
语法规则
数据类型[] 数组名 = new 数据类型[长度];
int [ ] arr = new int[3];
//后赋值
arr[0] = 10;
System.out.print(arr[0]);//10
-
-
已知存入元素值,用静态初始化。相反使用动态初始化
-
引用类型 类,接口,数组,String null -
数组元素求最大值
-
案例:有一组数:15, 9000 ,10000 ,20000, 9500, -5;
// 分析:使用数组定义 int[]faceScores = {15, 9000 ,10000 ,20000, 9500, -5}; // 定义遍历用于记录最值,建议默认存储第一个元素值作为参照。 int max = faceScores[0]; 遍历数组的每个元素,依次与最大值变量的数据比较,若较大,则替换 for (int i = 0; i < faceScore.length;i++) { if (faceScore[i] > max) { max = faceScore[i]; } }
-
第二章:遍历数组
-
定义
-
一个一个数据的访问。搜索、数据统计需要用到遍历。
-
例子:
int [] ages = {20,30,40,50};
for(int i = 0; i<ages.length; i++) {
System.out.println(ages[i]);
}
-
第三章: 数组案例
-
猜数字游戏
// 需求 游戏后台随机生成1-20 之间的5个数 为猜中提示:“未命中”继续猜测 猜中提示:“运气不错猜中了”,并输出该数据 // 核心代码 // 定义动态初始化数组5个随机的1~20之间的数据 int[] data = new int[5]; // 动态的生成5个1-20之间的随机数并存入数组中 Random r = new Random(); for (int i =0;i<data.length;i++) { // i = 0 1 2 3 4 data[i] = r.nextInt(bound:20) + 1; } // 使用死循环让用户猜测 Scanner sc = new Scanner(System.in); OUT: while (true) { System.out.println("请您输入1~20之间的整数猜测") int guessData = sc.nextInt(); // 遍历数组中的每个数据,看是否与猜测的数据相同,相同代表猜中了,给出提示 // System.out.print("[") for(int i = 0; i<data.length; i++) { if(data[i] == guessData){ System.out.println("您已经猜中了该数据,运气不错!您猜中的数据索引是:"+i); break OUT;//结束了整个死循环,代表游戏结束了! } } System.out.println("当前猜测的数据在数组中不存在,请重新猜测!") } // 输出数组的全部元素,让用户看到猜测的数字 for(int i = 0; i<data.length; i++) { System.out.print(data[i]+"\t"); }
-
随机排名
需求:某公司开发部 5名开发人员,要进行项目进展汇报现采取随机排名后进行汇报,依次录入5名员工的工号,随后展示出一组随机的排名顺序
22 33 35 13 88 ==》 13 35 88 33 22
分析:使用数组录入5名员工的工号进行存储,再依次遍历数组的每个元素,随机一个索引数据,当前元素与该索引处元素进行交换
//核心代码 1、动态初始化数组存储5个数据 int[] codes = new int[5]; // 定义一个循环,循环5次,依次录入一个工号存入对应的位置 Scanner sc = new Scanner(System.in); for ( int i = 0; i<codes.length;i++) { // 录入工号 System.out.println("请您输入第"+(i+1)+"个员工的工号"); int code = sc.nextlnt(); //存入数组中 codes[i] = code; } // 遍历数组中的每个元素,然后随机一个索引,该元素与速记索引位置处的元素值进行交换 Random r = new Random(); for (int i = 0; i< codes.length;i++) { // 当前遍历的元素值:codes[i] // 随机索引位置codes[index] int index = r.nextlnt(codes.length); //定义临时变量 int temp = codes[index]; codes[index] =codes[i]; codes[i] = temp; //遍历数组元素输出排名结果 for(int i = 0; i< codes.length;i++){ System.out.print(codes[i]+"\t"); } }
-
数组排序
- 冒泡排序 选择排序 快速排序 插入排序 堆排序
- 查找:二分搜索 分块查找 哈希表查找
// 冒泡排序 int [] arr = {5,2,3,1}; // 0 1 2 3 // 定义一个循环控制笔记的论数 for (int i = 1; i<= arr.length -1 ; i++) {// 若 i= 0 开始 j 需要少循环一次即arr.length-i -1 // i== 1 比较的次数 3 j = 0 1 2 // i == 2 2 j = 0 1 // 定义循环控制每轮比较的次数和占位 for (int j = 0; j < arr.length -i ; j++) { // 判断当前位置的元素值是否大于后一个文字 若较大则交换 if(arr[j] > arr[j+1] ) { int temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } // 遍历数组内容输出 for (int i = 0 ; i< arr.length; i++) { System.out.print(arr[i] + "\t") }
第四章:数组内存图,Debug工具
-
数组内存图
-
// 目标:理解2个数组变量指向一个数组对象 int[] arr1= {11,22,33}; // 数组arr1变量赋值给int类型的数组变量arr2 int [] arr2 = arr1; // 输出arr1 和arr2 arr[1] = 99; System.out.print(arr[1]); System.out.print(arr2[0]); System.out.print(ar2r[1]); System.out.print(arr2[2]);
-
常见问题
-
若访问的元素位置超过最大索引,执行会出现ArrayIndexOut(数据索引越界异常)
-
若数组变量中没有存储数组的地址,而是null 访问数组会出现NullPointerException(空指针异常)
arr = null; System.out.print(arr);// null
-
-
IDEA Debug工具的使用
-
食用方法:温水送服
-