目录
1.数组的定义及基本要素
1.1 为什么需要数组
当某个功能模块中,有许多同一类型的变量需要定义时,则需要有一个容器能够存放这些变量,而这个容器就是数组。
1.2 数组的定义
定义:数组是一个变量,是存储相同数据类型的一组数据序列
在内存中:声明一个数组变量就是在内存空间划出一串连续的空间
1.3 数组的基本要素
标识符:数组的名称,用于区分不同的数组
数组元素:数组中存放的每个数据
元素类型:数组元素的数据类型
元素下标:对数组元素进行编号,从0开始,数组中的每个元素都可以通过下标来访问
2.数组的语法结构
2.1 创建数组的方式
2.1.1 静态初始化
int[] array = new int[]{1,2,3,4,5};
//int[]表示定义了一个存放int类型数据的数组
//方括号也可以放在标识符的后面
int array[] = new int[]{1,2,3,4,5}
2.1.2 动态初始化
int[] array = new int[5];//先定义一个自动初始化的数组,但要规定他的长度
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
//可以用 数组名称[下角标] = 某个值 的方式对数组的某个元素进行赋值
2.1.3 注意事项
(1)一个数组只能存放一种类型的数据,这种数据类型在一开始就被规定好了
(2)一个数组在初始化后的长度是固定的,最大的下角标是长度-1,超过这个范围则会报错
(3)动态初始化的初始赋值依据不同数据类型而不同,int-->0 ,double-->0.0,String-->null , boolean -->false,char-->’’
2.2 示例
实现的功能:录入班级同学的成绩,并且将成绩存在数组中,最后输出平均分
Scanner scanner = new Scanner(System.in);
System.out.print("全班人数:");
int total = scanner.nextInt();
double[] scores = new double[total];
double sum = 0;
double avg = 0;
for (int i = 0; i < total; i++) {
System.out.println("请输入第" + (i + 1) + "位同学的成绩");
scores[i] = scanner.nextDouble();
sum += scores[i];
}
avg = sum / total;
System.out.println("平均分为:" + avg);
结果:
2.3 foreach循环的拓展
数组是接触到的第一个可遍历的对象,对于可遍历的对象,可以使用foreach循环对该对象进行遍历,语法结构相较于for循环更加简洁,且运行的效率有所提高。
2.3.1 示例
double[] scores = new double[]{1,5,3,5,8};
for (double i : scores) {
System.out.println(i);
}
结果:
3.数组的Arrays类方法
3.1 Arrays类
Arrays类是java.util包中的一个关于数组的方法集,最常用的方法是sort和binarySearch。在使用这些方法时,应当先导入java.util.Array类。
3.2 sort方法
sort方法是对数组中的元素进行升序排序
3.2.1 示例
int[] array = new int[]{3,1,7,3,4};
Arrays.sort(array);//使用Arrays.sort方法
for(int i : array){
System.out.println(i);
}
结果:
3.3 binarySearch方法
binarySearch方法是在已经升序排序的数组中搜索并返回目标值的索引值,如果不存在则返回(查找值的插入点)-1,注意存在多个目标值时,返回的索引值是这些目标值的索引值的中值(向上取整)
3.3.1 示例
int[] array = new int[]{3,1,7,3,4};
Arrays.sort(array);//先进行升序排序
//输出排序后的数组方便查看
for(int i : array){
System.out.print(i+"\t");
}
System.out.println();
//使用binarySearch
System.out.println(Arrays.binarySearch(array,7));//存在,返回值应当为4
System.out.println(Arrays.binarySearch(array,3));//存在,返回值应当为2
System.out.println(Arrays.binarySearch(array,5));//不存在,应该返回-4-1
System.out.println(Arrays.binarySearch(array,-1));//存在,返回值应当为0-1
结果:
4.数组的简单应用
4.1 求最大值
//创建一个数组用于测试
int[] scores = new int[]{95,90,85,70,77};
//先定义一个变量max存放当前遍历的最大值
int max = 0;
for (int i: scores) {
//遍历数组,当max小于当前的元素值时,将该元素值赋给max
if(max<i){
max = i;
}
}
//输出max
System.out.println("最大值为:"+max);
结果:
4.2 冒泡排序
4.2.1 冒泡排序的基本原理
冒泡排序的基本原理是利用双重循环进行排序,外层循环i从0至数组长度-1,内层循环j从0值数组长度-1-i,每次循环时比较数组当前值与下一个值的大小,将更大的放置在后面,因此每次循环可以找到内层循环到的数组元素的最大值。
4.2.2 冒泡排序的示例
//定义一个数组进行排序
int[] scores = new int[]{95,90,185,70,77};
//定义一个临时变量用于交换数组元素的位置
int temp;
//外层循环从0至length-1
for (int i = 0; i < scores.length - 1; i++) {
//内层循环从0至length-1-i
for (int j = 0; j < scores.length - 1 - i; j++) {
if(scores[j] > scores[j+1]){
temp = scores[j];
scores[j] = scores[j+1];
scores[j+1] = temp;
}
}
}
//输出数组,查看是否排序成功
for (int i: scores) {
System.out.print(i+"\t");
}
结果:
4.2.3 不同的写法
本人认为每次排序交换过于复杂且不好理解,因此改进了一下算法,更便于理解
int[] scores = new int[]{95,90,185,70,77};
int temp;
for (int i = 0; i < scores.length -1; i++) {
//此处改为从i+1到末尾进行遍历,一旦发现当前值比scores[i]的值更小,则将该值与其交换
for (int j = i+1; j < scores.length; j++) {
if(scores[i] > scores[j]){
temp = scores[i];
scores[i] = scores[j];
scores[j] = temp;
}
}
}
for (int i: scores) {
System.out.print(i+"\t");
}
结果与上面是一样的
5.二维数组
5.1 二维数组的定义
二维数组顾名思义是存放数组元素的数组,二维数组实际上也是数组,只不过其存放的数组元素是对一维数组的引用,以此类推还有三维,四位数组,但几乎不会使用。
5.2 二维数组的创建
二维数组同样可以使用静态初始化和动态初始化,要注意的是二维数组创建时可以不对其包含的一维数组定义长度,但要注意尽量定义长度。
//静态初始化
int[][] scores = new int[][]{{1,2},{1,2,3}};
//动态初始化
int[][] scores = new int[5][10];//定义了二维数组中的一维数组的长度
int[][] scores = new int[5][];//未定义二维数组中的一维数组的长度
5.3 示例
要使用二维数组实现录入五个班各五名学生后,输出每个班的总成绩
//定义一个二维数组存放每名学生的成绩
double[][] scores = new double[5][5];
//定义一个一维数组存放每个班学生的总成绩
double[] sum = new double[5];
Scanner scanner = new Scanner(System.in);
//遍历二维数组时采用双重for循环
for (int i = 0; i <scores.length ; i++) {
sum[i] = 0;
for (int j = 0; j < scores[i].length ; j++) {
System.out.print("请输入第"+(i+1)+"个班第"+(j+1)+"个学生成绩:");
scores[i][j] = scanner.nextDouble();
sum[i] += scores[i][j];
}
}
//输出sum中每个班的成绩
for (int i = 0; i < sum.length ; i++) {
System.out.println("第"+(i+1)+"个班的总成绩为:"+sum[i]);
}
结果:
其中每个班所有学生的成绩分别都为1,2,3,4,5