**数组
1,一维数组
1.1 数组的作用**
c;本章我们要学习数组,正式讲解数组概念之前先看个案例。
案例演示:Java考试结束后,老师给张浩分配了一项任务,让他计算全班(30人)Java课程考试的平均分。
本案例如果采用我们前几章的知识去实现的话,无非就是将全班每人的成绩存储起来,然后在相加,求和并取平均分。
这种方式,用脚趾头考虑都知道添麻烦了。查老师友情提示:凡是以后你写代码发现东西很复杂,繁琐,那么它一定存在着优化的可能。我们开发人员"能少写一行代码,绝对你不多写 行。
这变量定义30个,工作量和数据操作都不是特别方便,你求和必须把所有变量写一遍。可能有比教超前的同学,已经想到了好点的解决方法。
上面的方法的确简化了变量定义,也很好的用到了循环。但是如果我现在要求你给我拿到第28个学生的成绩!在上方的方法里你能拿到吗?或者我要求你将学生成绩求和完再去写个排序功能!你是不是还得再来循环复用。所以我们需要寻求存储数据的新方式!数组即可解决!
1.2 数组的概念
**c;数组是一个特殊“变量”,存储相同数据类型的一组数据。**声明一个变量就是在内存空间”划出一块合适的空间,声明一个数组就是在内存空间划出一串连续的空间。它是我们在学习过程中,必然要学习的一种数据存储方式!
类似于变量的组成,数组的组成也有几要素。
**数组基本要素:**1标识符 (数组的名称,用于区分不同的数组)
2.数组元素 (向数组中存放的数据)
3,元素下标:从0 开始(对数组元素进行编号,从0 开始,数组中的每个元素都可以通过下标来访问)
4,元素类型 (数组元素的数据类型)
1,声明数组。(告诉计算机数据类型是什么) 规范要求我们使用int[]a这种形式的声明。
2,分配空间。(告诉计算机分配几个连续的空间,此长度必须指定后不可变)
3,赋值。(向分配的格子里放数据,小心点,下标别超过数组长度,不然出现“数组越界异常”)
注意:数组定义好之后,不赋值也是有默认值的,不同的类型,默认值不同。
4,处理和使用数据。(上方3步骤就是数组的基本定义和赋值过程,至于使用,根据你实际需求灵活变通)
c:上方的定义学习中,我们见识了基本的数组赋值方式,就是将数组内的元素空间按照下标去一个个存储起来。例如:arr[1] = XXX;下面查老师带你看几种更灵活的赋值方式。
方法1: 边声明边赋值
此种方式只能定义为一条语句,绝对不能写成两条。
![在这里插入图片描述](https://img- blog.csdnimg.cn/20190326095900756.png)
方法2动态地从键盘录入信息并赋值(它解决了上方我们计算平均分时的成绩存储问题)
案例演示:计算5位学生的平均分。(同上方计算班级平均分一样)
数组作用再次答疑:有些同学在前期学习一些知识的时候,比较容易钻牛角尖,或者受限与眼界限制,无法全局关的去感受一些知识的作用。
1,数组可以存储n个值,不需要为了存储n个值去定义变量了。
2,数组的数据操作更加灵活,length属性和一会儿体验到的用法。
3,数组在未来学习“方法”时,“方法”的参数使用可以减少新参的数量。
等等。。。
1,3,3 增强for循环(foreach)
c:上方我们利用数组有下的特点,使用for循环来进行了遍历,借助arr[I]的形式将每一个元素拿出来并使用。其实在Java中为了更方便的遍历数组或集合,有一种增强型的for循环。(foreach),一般我们称只为增强for循环。它和普通for循环的区别是它没有技术变量i之类的,它是将数组中的每一个元素取出来并且临时存到一个变量里。
1.4 引用数据类型初识
g
c:我们在第二章学习数据类型时有一种类型划分是:基本数据类型和引用数据类型。今天我们学习的数组当时就提到过,它也是一种类型,属于引用数据类型。基本数据类型存储的数据都是在栈内存(JVM内存模型中的一块区域)中分配空间的。当超过变量的作用范围之后,这里的变量会马上回收,所占用空间将另做它用,本次课之前所讲的那些变量也都是在栈内存分配空间的。
而我们今天讲的数组,或者你甚至可以记忆为通过new创建的东西。例如以后要讲解的对向,它是在对内存中分配空间来存储的。
同时还可以在栈内存中定义一个引用变量(声明),取值为分配的数组或对象空间的首地址,用来实现对数组或对象内容的访问。
当对内存这里的失去引用,变成垃圾后,将由垃圾回收器(Java的强大之处之一)负责自动回收,释放所占用的内存空间。回收的时机是不确定的,并不见得马上回收,也可能程序执行完毕还没有回收,受内存剩余空间大小和垃圾回收器算法影响。
想理解引用数据类型,上课好好去听查老师的讲课至位,联想例子:现在我们天天推广云的概念,例如云存储,以前我们是将数据直接存储到了本地,就像基本数据类型存储数据到栈中,而现在呢我们将数据存储到云端就像引用数据类型存储数据在堆中,我们需要一个云盘地址和账号就可以访问存储的数据,就像引用数据类型空间的地址传递给 栈中声明的引用。(后续在对象阶段还会对引用数据类型进行讲解)
1.5 数组的常见应用案例
1.5.1 猜数字
案例演示1:有一个数列:8,4 ,2, 1, 23, 344, 12
1,循环输出数列的值
2 ,求数列中所有数值的和
3,猜数游戏:从键盘中任意输入一个数据,判断数列是否包含次数
1.5.2 求最高分
案例演示2:从键盘输入本次java考试五位学生的成绩,求考试成绩最高分。
Scanner input = new Scanner(System.in);
//声明一个数组 存储学生们的考试成绩
int[] stuScores = new int[5];
//向数组中里存储数据
for(int i = 0 ; i < stuScores.length;i++){
System.out.print("请输入第+(i+1)+“位学生的成绩:”);
}
//开始计算最高分
//假定第一个元素为最大值
int max = stuScors[0];
for(int i = 1; i< stuScores.length;i++){
if(stuScores[i]);
}
}
System.out.println("输入的成绩最高分为:"+max);
}
1.5.3 插入数字(难)
案例演示3:有一组学员的成绩{99,85,82,63,60},将它们按降序排列。要增加一个学员的成绩,将它插入成绩序列,并保持降序。
1.6 Arrays数组工具类
c:java.util包提供的工具类,Arrays类提供操作数组的方法,如:排序,查询。
2,冒泡排序(算法)
2,1冒泡排序概述
c:我们培训期间,基本不讲底层原理和算法,主要讲应用。但是一些必要掌握的东西还是要看看的,冒泡排序是计算机专业大学必修排序之一,也是我们程序员必知八大排序之一,也是笔试中最爱出现的一种排序体型。它便捷,快速,好学(小口诀:外层循环n-1 内层循环n-1-i)。
2.2排序原理概述
冒泡排序算法的运作如下:(从后往前)
1,比较相邻的元素。如果第一个比第二个大,就交换它们两个。
2,对每一对相邻元素作同样的工作,从开始第一个对到结尾的最后一对,在这一点,最后的元素应该会是最大的数。
3,针对所有的元素重复以上的步骤,除了最后一个。
4,持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3.二维数组
3.1二维数组的概述
c:我们在上方学习了一堆数组,然后看一个案例,看看这个案例用一堆组合不合适。
需求:要求对3个班个5名学生某门课程的成绩进行各种操作,如何实现?
固然如果定义3个一堆数组是可以的,但是未免过于麻烦,所以可以使用多维数组。
.多维数组也可以有三维及以上的数组很少使用
主要使用二维数组
从语法上java 支持多维数组
从内存分配原理的角度讲,只有一堆数组
3.2二维数组的使用