**
**
假如需要统计某公司员工的工资情况,例如计算平均工资、最高工资、最低工资等。假设该公司有500名员工,用前面学的知识,程序员首先需要声明500个变量分别存储每位员工的工资,然后在进行操作,这样做会很麻烦的,而且错误率也会很高,因此我们可以使用数组(容器)进行操作,将所有的数据全部存储到一个数组中,统一操作。
**
**
1.数组概念:数组就是存储一组相同类型数据的数据结构。 2.数组本身也属于引用类型。 3.数组中的元素可以是基本数据类型,也可以是引用类型。 **
** 定义语法一:
1.格式:数组存储的数据类型[ ] 数组名字=new 数组存储的数据类型[长度];
1》数组存储的数据类型:创建的数组可以存储什么类型的数据(就是基本数据类型) 2》[ ]:表示数组 3》数组名字:定义的数组需要起个变量名,满足标识符规范,可以使用数组名字对数组进行操作(数组名字可以任意取) 4》new:关键字,创建数组使用的关键字(每new一下,就是一个新的数组) 5》数组存储的数据类型:必须要和前面的数据类型一致,否则将会报错 6》[长度]:数组的长度,表示数组中可以存储多个元素 7》注意:数组是定长特性,长度一旦指定,就不可更改,一旦超过该定义的长度将会报错
例子: int[] num=new int[5]; double[]d=new double[6]; char[]c=new char[5]; boolean[] b=new boolean[5];
定义语法二:
1.格式:数据类型[]数组名=new 数据类型[]{元素1,元素2,元素3,…};
1》这种语法,属于在创建数组时,就对数组进行初始化操作。 2》[ ]:不需要指定数组的长度,数组的长度由{}中元素的个数来决定。
例如: int[]arr=new int[]{1,2,3,4,5} double[]d=new double[]{1.0,2.0,3.0} char[]c=new char []{‘a’,‘b’,‘c’}
定义语法三:
1.格式:数据类型[]数组名={元素1,元素2,元素3,元素4,…};
例如: int[]nums={1,2,3,4,5}; double[]d={1.0,2.0,3.0}; char[]c={‘a’,‘b’,‘c’,‘d’};
**
** 索引(下标):
1》索引:每一个存储到数组的元素,都会自动拥有一个整数编号,从0开始,这个自动编号称为数组索引(index)或下标,可以通过数组的索引访问到数组中的元素。 2》语法:数组名[索引] 3》数组的长度属性:每个数组都具有长度,而且是固定的,java中赋予了数组一个属性,可以获取数组的长度,语法为:数组名.length,属性length的执行结果就是数组的长度。由此可以推断出数组的最大索引值为数组长度-1,也就是数组名.length-1. 4》索引访问数组的元素 5》格式1:数组名[索引]=数值,为数组的元素赋值 格式2:数组名[索引],获取数组中的元素
**
**
1.数组越界异常 观察以下代码,运行后会出现什么问题? public static void main(String[] args) { int[]arrs={1,2,3}; System.out.println(arrs[3]); }
创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出ArrayIndexOutOfBoundsException数组索引越界异常。
2.数组空指针异常 public static void main(String[] args) { int[]arr=null;//数组属于引用类型,如果给引用类型赋值为空,那就是null System.out.println(arr[0]); } 以上代码,在运行过程中,因为数组arr=nulll,索引再访问数组中的元素时,会产生一个NullPointerException空指针异常。
**
**
代码举例: public static void main(String[] args) { int[]nums=new int[]{1,2,3,4,5,6,7,8,9}; for(int i=0;i<nums.length;i++){ System.out.println(nums[i]); }
**
**
1.例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1 1》数组的反转:数组中的元素颠倒顺序 2》实现思路: 3》实现反转,就需要将数组最远端元素位置交换 4》定义两个变量,保存数组的最小索引和最大索引 5》两个索引上的元素交换位置 6》最小索引++,最大索引–,再次交换位置 7》最小索引超过了最大索引,数组反转操作结束
代码演示:
package com.bdit; //数组的反转,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1 public class Test7 { public static void main(String[] args) { int[]arr={1,2,3,4,5}; //获取最大索引 int max=arr.length-1; for(int min=0;min<=max;min++){ //利用第三方变量完成数组中的元素交换 int temp=arr[min]; arr[min]=arr[max]; arr[max]=temp; max–;//最大索引 } for(int i=0;i<arr.length;i++){ System.out.println(arr[i]); } } }
**
**
1.目标数组至少要和源数组的长度一致,循环源数组,每循环一次,就把源数组中的数据赋值给目标数组中相应的索引位置即可。
代码演示:
public static void main(String[] args) { int[]arr={1,2,3,4,5,6}; //目标数组 int[]arr2=new int[arr.length]; //循环源数组 for(int i=0;i<arr.length;i++){ arr2[i]=arr[i]; } for(int i=0;i<arr2.length;i++){ System.out.println(arr2[i]); } }
2.还可以利用System.arraycopy(arg1,arg2,arg3,arg4,arg5)来实现数组的复制 1》arg1:表示源数组 2》arg2:表示从源数组哪个索引位置开始复制 3》arg3:表示目标数组 4》arg4:表示目录数组从哪个索引位置开始存放数据 5》arg5:表示要复制元素的个数 6》System.arraycopy(arr,0,arr2,0,arr.length);
**
**
1.编写代码实现对数组中元素的升序和降序排列 2.冒泡排序:比较两个相邻的元素,将值大的元素交换至右端。 1》思路 2》假如数组中有5个元素,需要总共循环对比4次 3》每循环对比一次,里层的循环,就要对比N次 4》说明,数组本身是无须的
代码演示:
package com.bdit; //冒泡排序 public class Test10 { public static void main(String[] args) { int[]nums={100,23,43,566,2,45,56,9,78,1}; //升序排列 // for(int i=0;i<nums.length-1;i++){//外层循环控制的循环的次数 // //里层循环控制,外层循环每执行一次,需要对比的次数 // for(int j=0;j<nums.length-1-i;j++){// // if(nums[j]>nums[j+1]){ // int temp=nums[j+1]; // nums[j+1]=nums[j]; // nums[j]=temp; // } // } // } //降序排列 for(int i=0;i<nums.length-1;i++){//外层循环控制的循环的次数 //里层循环控制,外层循环每执行一次,需要对比的次数 for(int j=0;j<nums.length-1-i;j++){// if(nums[j]<nums[j+1]){ int temp=nums[j+1]; nums[j+1]=nums[j]; nums[j]=temp; } } } } for(int n:nums){ System.out.println(n); } } } **
** 二维数组的声明:
数据类型[ ][ ] 数组名; 数据类型 数组名[ ][ ]; 【几维数组,就需要有几个对应的中括号,一次类推下去】 **
**
1.语法格式:数组名=new 数据类型[表示二维数组的长度][表示每个一维数组有几个元素];
例如:int [][]num=new int [2][3];
注意:在创建二维数组时,必须指定二维数组的长度;第二个中括号中的值不是必须的,如果没有明确声明,则把每个一维数组中的元素个数,作为一维数组的长度。
**
**
例如:int [][]num={{1,2,3},{,4,5,6},{7,8,9}}; 注意:二维数组的长度是有一维数组的个数决定的
代码演示:
package com.bdit; //二维数组 静态初始化 public class Test14 { public static void main(String[] args) { int[][]nums={{1,2,3},{4,5,6},{7,8,9}}; //nums[0][0] System.out.println(nums.length); for(int i=0;i<nums.length;i++){ for(int j=0;j<nums[i].length;j++){ System.out.println(nums[i][j]); } } } }
**
** 代码演示:
package com.bdit; //二维数组动态初始化 public class Test15 { public static void main(String[] args) { int[][]nums1=new int[2][2]; //根据下标赋值 nums1[0][0]=10; nums1[0][1]=20; nums1[1][0]=40; nums1[1][1]=50; System.out.println(nums1[0][0]); //声明多维数组 int[][]nums; //创建二维数组对象 nums=new int[2][]; //动态初始化,就是根据下标 nums[0]=new int[2]; nums[0][0]=20; nums[0][1]=30; nums[1]=new int[2]; nums[1][0]=40; nums[1][1]=50; for (int i = 0; i < nums.length; i++) {//每循环一次,得到的是一个一维数组 for(int j=0;j<nums[i].length;j++){//循环一维数组 System.out.println(nums[i][j]); } } } }
**
**
从键盘输入三组成绩,每组成绩包括(语文、数学,英语),把每一组成绩中最高和最低的输出,并且统计出三组成绩中,最高的和最低的。
代码演练:
public class Test3 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int[][]unm=new int[3][3]; for(int i=0;i< unm.length;i++){ System.out.println(“请输入第”+(i+1)+“组语文,数学,英语成绩:”); for(int j=0;j<unm[i].length;j++){ unm[i][j]=sc.nextInt(); } } int ma=unm[0][0]; int mi=unm[0][0]; for(int i=0;i< unm.length;i++){ int max=unm[i][0]; int min=unm[i][0]; for(int j=0;j<unm[i].length;j++){ if(min>unm[i][j]){ min=unm[i][j]; }if(max<unm[i][j]){ max=unm[i][j]; } if(mi>unm[i][j]){ mi=unm[i][j]; }if(ma<unm[i][j]){ ma=unm[i][j]; } } System.out.println(“第”+(i+1)+“组中:max”+max+" min:"+min); } System.out.println(“成绩中:max:”+ma+" min:"+mi); } }
