第四章:数组
数组的定义
数组是一个相同类型的有序集合。
特点:
1.数组的长度一旦声明指定后,无法更改
2.数组中的数据类型不能混合(数组中元素的数据类型不能混合存储)。
数组的声明
数据类型[] 数组名;
或
数据类型 数组名[];
eg:
int nums[];
int[] nums;
数组在声明时并未分配空间。
数组的初始化
1.声明数组
数据类型[] 数组名;
2.初始化
数组名 =new 数据类型[长度];
数组的长度:数组中能容纳最大元素的个数。
数组的下标:表示数组中元素存储位置,其存取范围[0,数组的长度-1].
eg:
int[] nums;
nums=new int[5];
数组初始化并赋值
动态初始化
数组的声明,初始化和赋值分开编写.
int[] nums;
nums=new int[4];
int[] nums=new int[4];
nums[0]=10;
...
静态初始化
数组的声明,初始化和赋值一步完成。
数据类型[] 数组名={值1,值2....};
int[] nums={1,2,3,4,5};
注意:不能指定长度,其长度取决于元素的个数。必须在编写在一行语句。
int[] nums;
nums={1,2,3,4,5};//错误写法。
int[]nums=new int[]{1,2,3,4,5};//正确
高级for循环(for-each)循环
高级for循环(for-each循环):JDK1.5以后的新特性。
语法:
for(元素的数据类型 变量名:数组或集合){
//循环体
}
执行过程:通过数组的下标将元素取出,并赋值给变量: int n = nums[i];
注意:元素的数据类型必须和数组的数据类型一致。
使用场景:功能略逊于for循环,在for-each无法直接使用数组的下标。主要用于遍历操作。
eg:
int[] nums = {10,20,30,40,50};
//方法一:通过数组下标进行遍历
for(int i=0;i<nums.length;i++){
int n = nums[i];
System.out.println(n);
}
System.out.println("*******************");
//方法二:使用for-each进行遍历
for(int n:nums){
System.out.println(n);
}
综合案例
public static void main(String[] args){
/*
根据用户输入的人数,动态创建数组,并获取用户输入的成绩,统计最高分,最低分和平均分
*/
double sum=0;//总成绩
double avg=0;//平均成绩
double max,min;//最高成绩和最低成绩
System.out.println("请输入班级人数:");
Scanner input = new Scanner(System.in);
int num = input.nextInt();//获取用户输入的人数
//创建数组用于保存学生成绩:数据类型[] 数组名 = new 数据类型[长度]
double[] scores = new double[num];//根据人数动态创建数组用于保存学生成绩
for(int i=0;i<scores.length;i++){
System.out.println("请输入第"+(i+1)+"个人的成绩:");
scores[i]=input.nextDouble();//获取学生成绩,并将其保存到数组中
}
//假设第一个人的成绩是最高分
max = scores[0];
//假设第一个人的成绩是最低分
min = scores[0];
//遍历
for(int i=0;i<scores.length;i++){
//System.out.println(scores[i]);
sum+=scores[i];//计算总成绩
if(scores[i]>max){
max = scores[i];
}
if(scores[i]<min){
min = scores[i];
}
}
avg = sum/scores.length;//计算平均成绩
System.out.println("最高分:"+max+",最低分:"+min+",平均分:"+avg);
}
数组的常用算法
删除元素
数组中添加或删除元素需要大量的移位,效率较低。
冒泡排序
原理:将相近的两个数字进行比较,大的向后去,小的向前赶。每比较一轮可以确定一个最大值。
冒泡排序口诀:
N个数字来排队,两两比较小靠前。
外层循环N-1(控制需要比较的轮数)
内层循环N-1-i(控制每轮需要比较的次数)
查找元素
通过元素的遍历进行查找
二分法查找
前提:待查找的数组是有序的数组(大小顺序)
原理:将要查找数字与中间元素进行比较。
如果比中间元素值大,到右边进行查找
如果比中间元素值小,到左边进行查找
java.util.Arrays工具类
除java.lang包下的类和接口可以直接使用之外,其他包下的类和接口在使用时,需要使用import关键字进行导包
java.util.Arrays类:提供了一下对数组操作的方法。
常用方法:
sort(...):对数组进行排序,默认使用升序
toString(..);可以将数组转换成字符串。
binarySearch(....):二分法进行搜索指定元素,并返回元素的下标
fill(..):将数组中的元素替换成指定的数字
copyOf(..):将数组指定长度的元素复制到一个新数组并返回
copyRange():复制数组中指定范围的元素到新数组,并返回。
命令行参数
public static void main(String[] args){
}
命令行参数作用:可以在执行java命令的过程中为main方法传递参数。
语法: java 类名 值1,值2...
注意:值1,值2..应该是字符串类型,命令行参数会将值1,值2...封装到args中传入给main方法,下标从0开始
可变参数
可变参数(...):从JDK1.5之后引入的新特性。
作用:避免因相同类型的参数个数不同而编写大量重载方法。
可变参数可以代表0或多个指定类型的参数。
可变参数只能作为方法的形参(在方法的定义时)使用,并且一个方法中最多只能有1个可变参数,位置必须放在参数的最后一个位置。
处理时可以将可变参数当作数组进行处理。
二维数组
定义
二维数组:一个数组中每一个元素又是一个数组(数组嵌套数组)。
声明和初始化
语法:
数据类型[][] 数组名 = new 数据类型[rows][cols];
eg:
int[][]nums=new int[3][2];
nums[0][0]=1;
nums[0][1]=2;
...
注意:二维数组声明时需要按照高纬度向低纬度的顺序指定。
int[][]nums = new int[3][];//合法
int[][]nums = new int[][3];//不合法
静态初始化:
int[][]nums={{1,2},{3,4},{5,6}};
int[][]nums={{1,2},{3,4},{5,6,7}};
int[][]nums;
nums={{1,2},{3,4},{5,6}};//错误